3

これが私の状況です:

am:n-アーティストとイベントの関係があります。私がやろうとしているのは、特定のアーティストを含むイベントのみを含むIQueryableを取得することです。データアクセス層にリポジトリを使用しています。明らかに、次のアプローチは機能しません。

_db.EventSet.Include("Location").Where(e => (e.Artists.Contains(artist)) && (e.StartDate > System.DateTime.Now)).OrderBy(e => e.StartDate);

私はEntityFrameworkを初めて使用するので、その理由はよくわかりませんが、推測できます。ですから、誰かがこれを非常に簡単な方法で説明できた場合、私も感謝します。とにかく、私が思いついた私の解決策は次のようになります:

IQueryable<Event> events = _db.EventSet.Include("Location").Where(e => (e.EndDate > System.DateTime.Now));
List<Event> eventsList = new List<Event>();
foreach (var ev in events)
{
    eventsList.Add(ev);
}
return (IQueryable<Event>)eventsList.AsQueryable().Where(e => e.Artists.Contains(artist)).OrderBy(e=>e.StartDate);

すべてのイベントが取得および処理されるため、これはまったく良い解決策ではありません。これは大きなオーバーヘッドです。私の問題のより良い解決策を教えてくれる人はいますか?また、ObjectQueryとは何か、およびObjectQueryをIQueryableにキャストする方法(可能であれば)を実際には理解していなかったという事実も認識しています。

私はどんな提案にも感謝しています。

4

1 に答える 1

2

アーティスト ID フィールドでAnyを使用できます。ここでは、次の名前を想定していArtistIdます。

_db.EventSet.Include("Location")
            .Where(e => (e.Artists.Any(a => a.ArtistId == artist.ArtistId)) && (e.StartDate > System.DateTime.Now))
            .OrderBy(e => e.StartDate);
于 2010-11-16T17:16:59.790 に答える