Использование StringCollection, указанного в настройках приложения в запросе LINQ-to-Entities - PullRequest
2 голосов
/ 08 февраля 2012

В моем приложении у меня есть свойство Property, которое имеет тип String.Collections.Specialized.StringCollection.Он содержит список кодов клиентов, таких как MSFT, SOF, IBM и т. Д. Я пытаюсь использовать это в запросе Linq-to-Entities в предложении where:

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

Сбой, так как Contains isне распознается Linq-to-Entities с сообщением, похожим на:

"LINQ-to-Entities не распознает метод Contains ...."

Как изменить код вышечтобы избежать этой ошибки?

Ответы [ 3 ]

12 голосов
/ 13 сентября 2012

Более короткий путь

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

Это удобный трюк для любой ситуации, когда коллекция по своей природе не поддерживает LINQ.

2 голосов
/ 08 февраля 2012

Поскольку ваш вопрос помечен как 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);
1 голос
/ 08 февраля 2012

Ответ на этот вопрос .EF4, очевидно, поддерживает Contains напрямую, так что это будет мое предпочтительное решение ...:)

...