2

私は以下のようなシナリオを持っています:

    Event:

public int EventId { get; set; }
public string EventName { get; set;}


MediaGallery:

public int MediaGalleryID { get; set; }
public string Name { get; set; }
public List<int> EventId { get; set;}


List<Event> eventList = query.Event.ToList();    
List<MediaGallery> mediaGallreis = query.MediaGallery.ToList();

MediaGallery の eventID リストに eventId が存在する eventList を取得する必要があります。誰でも私にアドバイスできますか?

4

2 に答える 2

5

以下を試してください

var list = eventList
  .Where(e => mediaGalleries.Any(mg => mg.EventId.Any(id => id == e.EventId)));

mediaGalleriesまたはMediaGallery::EventIdリストが十分に大きい場合は、別のアプローチを検討することをお勧めします。可能な値のセットを作成し、そのセットに直接クエリします

var idSet = new HashSet(mediaGelleries.SelectMany(x => x.EventId));
var list = eventList.Where(e => idSet.Contains(e.EventId));
于 2013-04-12T15:19:04.920 に答える
1

この特定のタスクには、クエリ内包構文が最も適していると思います。質問を正しく解釈した場合、MediaQuery の EventId リストに ID を持つすべてのイベントが必要です。役立つはずのLinqクエリを次に示します。

    var eventList = 
         (from mediaGallery in query.MediaGallery
          from eventId in mediaGallery.EventId
          join event in query.Event
          on eventId equals event.EventId
          select event)
         .Distinct()
         .ToList();

他のオプションほど簡潔ではありませんが、代替手段として提示したいと思います。

double from 構文の使用に注意してください。これは、SQL ユーザーには奇妙に見えるかもしれません。この構文が好ましくない場合は、次のクエリも機能するはずです。

    var eventList = 
         (from event in query.Event
          where query.MediaGallery.Any(mediaGallery =>
            mediaGallery.EventId.Contains(event.EventId))
          select event)
         .ToList();

このコードは構文的に複雑であり、クエリ内包構文 (from、where、select)、連鎖構文メソッド (Any)、および (Contains) がサポートされているという事実を理解する必要があるため、私は最初のオプションを好みます。

もちろん、これらの複雑さはすべて他のコードに置き換えることができるので、自分にとって最も自然なオプションを選択してください。私の意見では、適度に複雑なクエリであっても、クエリ内包構文を好みます。

于 2013-04-12T17:42:45.850 に答える