2011-08-03 12 views
1

私はLINQにはかなり新しいので、私は単純なものがないと思います。私は次のエラーを生成するコードを持っている:ローカルシーケンスは、あなたがより明確化が必要な場合は私に知らせてください簡単なLINQ質問: "ローカルシーケンスを使用できません"エラー

return (from x in db.CurrentTrackings 
       where x.strLocation == BarCode || 
       (from b in ChildBranches where x.strLocation == b.BarCode select b).Count() > 0 || 
       (from c in PlantCustomers where x.strLocation == c.customer_str_id select c).Count() > 0 
       select x).Count(); 

をSQLにLINQで使用することはできません。これはうまくいくはずだが、私は何かが欠けているに違いない。

答えて

2

LINQ-to-SQLプロバイダーがローカルクエリの変換をサポートしていないため、ローカルシーケンスのサブクエリ(例:ChildBranches)にLINQ-to-SQLクエリ(つまりdb.CurrentTrackings)を混在させることはできませんSQLクエリに変換します。 SQL にLINQサポートは(含まれていない)それはWHERE X IN (Y1, Y2, Yn)の文に変換し、その場合にはローカルシーケンス、用:

var barCodes = ChildBranches.Select(b=>b.BarCode); 
var customerIds = PlantCustomers.Select(c=>c.customer_str_id); 

return (from x in db.CurrentTrackings 
     where x.strLocation == BarCode || 
       barCodes.Contains(x.strLocation) || 
       customerIds.Contains(x.strLocation) 
     select x).Count(); 
+0

これは素晴らしいです!今私の問題は、私は非常に多くのデータを持っているので、このクエリを何度も呼び出さなければならないので、それは本当に遅いです。 – zmarks22

+0

コンパイルされたクエリを使用しますか? –

0

クエリは、SQL Serverに送信されるSQLステートメントを生成しますが、ChildBranchesおよびPlantCustomersコレクションはSQL Serverに渡すことはできません。

1

LocalSequencesは、あなたが使用している場合を除き、SQLに変換することはできませんので、あなたのクエリはおそらく望んで含まれてい〜になる

return (from x in db.CurrentTrackings 
     where 
     x.strLocation == BarCode || 
     ChildBranches.Select(b=>b.BarCode).Contains(x.strLocation) || 
     PlantCustomers.Select(c=>c.customer_str_id).Contains(x.strLocation) 
     select x).Count();