3

私のアプリケーションには、String.Collections.Specialized.StringCollection 型のプロパティ設定があります。MSFT、SOF、IBM などの顧客コードのリストが含まれています。where 句の Linq-to-Entities クエリでこれを使用しようとしています。

var ShippedOrders = dbcontext.Orders
 .Where(s=>(s.Status.Description.Equals("Shipped") && !Properties.Settings.Default.CustomersToExclude.Contains(s.CustomerCode)));

これは、Contains が Linq-to-Entities によって認識されず、次のようなメッセージで失敗するためです。

「LINQ-to-Entities はメソッド Contains を認識しません....」

このエラーを回避するには、上記のコードをどのように修正すればよいですか?

4

3 に答える 3

16

より短いパスは

myProperties.Settings.Default.CustomersToExclude.Cast<string>().Contains(blah); 

これは、コレクションが本質的に LINQ に対応していない場合に便利なトリックです。

于 2012-09-13T16:55:08.360 に答える
2

あなたの質問は C# 4 としてタグ付けされているので、List<string>代わりに a を使用すると ( StringCollectionis 古い)、クエリが機能するはずです。また、クエリの外でリスト参照を解決する必要があります。

List<string> customersToExclude = ..
var ShippedOrders = dbcontext.Orders
                             .Where(s=>(s.Status.Description.Equals("Shipped") 
                                    && !customersToExclude.Contains(s.CustomerCode)));

編集:

顧客を配列にコピーして、それを使用するだけです。

var customerstoExclude = new string[Properties.Settings.Default.CustomersToExclude.Count];
myProperties.Settings.Default.CustomersToExclude.CopyTo(customerstoExclude, 0);
于 2012-02-08T17:25:58.940 に答える
1

これは関連する質問で答えられます。EF4はどうやらContainsを直接サポートしているようですが、それが私の好みの解決策になるでしょう... :)

于 2012-02-08T17:24:20.577 に答える