2009-07-05 9 views
33

「ローカルコレクションでクエリがサポートされていない」、私は "を指定するとID idのローカルに作成されたコレクション内に含まれている人々の集まり(のIQueryable)だから、例外

を返すようにしようとしていますローカルに作成されたコレクション "、私は、LinqToSqlクエリから来ていないIdsコレクションは、(ユーザー入力に基づいて)プログラムで作成されていることを意味します。私のクエリは次のようになります :

var qry = from p in DBContext.People 
        where Ids.Contains(p.ID) 
        select p.ID; 

これは、次の例外が発生し...

私はそのIDを持つすべての人を見つけることができますどのように

を「ローカルコレクションでクエリがサポートされていません」私のローカルに作成されたIdsコレクションに含まれていますか?

LinqToSqlを使用することは可能ですか?

答えて

34

Idsがリスト、配列などの場合、L2Sはcontainsに変換されます。

IdsがIQueryableの場合、クエリで使用する前にリストに変換するだけです。例:

List<int> listOfIDs = IDs.ToList(); 
var query = 
from st in dc.SomeTable 
where listOfIDs.Contains(st.ID) 
select ..... 
+2

私はあなたの問題に対する解決策がこの答えよりも微妙だと思います。私は同じ構築(WHERE句のIQueryableのメソッドを含む)を成功させ、LINQ to SQLはそれをSQLクエリのWHERE EXISTS句に変換します。それはいくつかの状況で動作するように思われますので、あなたがIds IQueryableをどのように取得するのかを投稿してください。 –

+1

私の答えが十分明確でない場合、L2SはEnumerable.Containsに渡されたローカルのIEnumerable(遅延IQueryableではない)を期待しています。ローカルクエリを渡すと、SQLクエリに変換することはできません。リスト/配列/ etcを渡すと、SQL "where ... in(x、y、...、n)"節に変換できます。 – KristoferA

+2

私はあなたが言っていることを見ていると思う: - リスト/配列/等を渡す。 OKですが、WHERE ... IN句が生成されます。 - 遅延IQueryableを渡すことはOKです。現在の遅延クエリと統合されます。 - ローカルのIEnumerableを渡すことはできませんが、それは.ToList()だけで問題ありません。 –

26

私もこの問題に苦しんでいました。すみませんが、私はさらに沿って、ダイナミックタイプをやっていると、ここでの答えは私のために動作しませんでした

people.Where(x => ids.Any(id => id == x.ID)) 
+0

@maxlegoそして生成されたSQLは降下します。ありがとう –

0

代わりに)(どれを使用して私の問題を解決しました。

私がしたことは、 "UNION"を素晴らしいループで使用することでした。方法は次のとおりです。

var firstID = cityList.First().id; 
var cities = dc.zs_Cities.Where(c => c.id == firstID); 
foreach(var c in cityList) 
{ 
    var tempCity = c; 
    cities = cities.Union(dc.zs_Cities.Where(cty => cty.id == tempCity.id)); 
} 
関連する問題