2012-01-27 4 views
2

LINQ to Entitiesを使用していますが、単純なORクエリを実行しようとしています。私は "リンク"と呼ばれるテーブルを持っています。私はクエリを実行するときに、タグのリストからのすべてのリンクと検索用語に一致するすべてのリンクを含める必要があります。たとえば、次のようにLINQで簡単なORクエリを実行するには?

var tags = new List<string> 
{ 
    "games", 
    "events", 
    "recipes" 
}; 

var searchTerms = new List<string> 
{ 
    "hockey", 
    "barbecue", 
    "cheesecake", 
    "basketball" 
} 

var links = _entityContainer.Links 
    .Where(x => x.Tags.Any(y => tags.Contains(y.Name)) 
    .Where(x => searchTerms.Any(y => x.Title.Contains(y))); 

注:リンクエンティティは、タグのリストは、私が探してるかどうかを確認するためにTagsので、最初.Where()に、私は、リンクのコレクション内のタグのそれぞれをチェックしてると呼ばれるナビゲーションプロパティを持っていますそのうちの1つが含まれています。

2番目の.Where()では、リンクのタイトルプロパティに検索語句が含まれているかどうかを確認しています。

私の問題は、このコードには、リストから少なくとも1つのタグを含むすべてのリンクが含まれており、検索語句の1つに一致しているということです。しかし、私は両方を一緒に取り入れたいと思っています。リンクリストに、リスト内の1つ以上のタグと一致するか、リスト内の1つ以上の検索用語と一致するすべてのリンクを含めるようにします。

tags.Contains()searchTerms.Any()のために、これらの呼び出しがEFに渡される式に変換できないため、問題があります。私がToList()を実行した場合、それらは機能しますが、非常に多数のレコードをメモリに取り込むので、私はそれを行うことができません。

私の目標を達成するための提案はありますか?どんな助けでも大歓迎です。

+0

はまだあなたがあなたを行うことを可能にしながら '代わりに、それはかなりメモリフットプリントを削減すべきである)' ToListメソッドを() '使用しますが、' AsEnumerableを(使用しないでください。クエリ。 –

答えて

7

節1にそれを凝縮:

var links = _entityContainer.Links 
    .Where(x => 
     x.Tags.Any(y => tags.Contains(y.Name)) || 
     searchTerms.Any(y => x.Title.Contains(y))); 
+0

これは良いですが、 'tags.Contains()'と 'searchTerms.Any()'の呼び出しにはまだ問題があります。 – Chev

+0

私はこれを働かせました。ありがとうございました。 – Chev

関連する問題