使用LINQ-to-Entities查询中的“应用程序设置”中指定的StringCollection

时间:2012-02-08 17:13:53

标签: c# c#-4.0 linq-to-entities settings stringcollection

在我的应用程序中,我有Property Setting,它的类型为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)));

此操作失败,因为Linq-to-Entities无法识别包含类似于

的消息的包含

“LINQ-to-Entities无法识别方法包含......”

如何修改上述代码以避免此错误?

3 个答案:

答案 0 :(得分:12)

较短的路径是

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

对于任何集合本身不支持LINQ的情况,这是一个方便的技巧。

答案 1 :(得分:2)

由于您的问题被标记为C#4,请改用List<string>StringCollection是古老的)并且您的查询应该有效。您还应该在查询之外解析列表引用:

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);

答案 2 :(得分:1)

这是在related question中回答的。但是EF4显然支持直接包含,所以这是我最喜欢的解决方案......:)