2013-11-25 2 views
1

Сценарий: У меня есть список ключевых слов, и я хочу добавить предложение Linq Where, чтобы проверить, содержит ли поле описания объекта продукта ВСЕ три ключевых слова.list.All/list.Any в LINQ Где предложение, вызывающее ошибку Internal Framework

Я пытаюсь добавить следующий пункт, где на мой вопрос:

query = query.Where(product => keywords.All(product.Description.Contains)); 

запрос: является IQueryable (Product) ключевые слова: это список Описание: это поле в продукте.

Когда я пытаюсь запустить этот код, я получаю исключение ошибки поставщика данных .NET Framework 1025.

Я также попытался создать выражение отдельно, как так, как и на другие должности:

Expression<Func<Product, bool>> expr = product => keywords.All(product.Description.Contains); 
      query = query.Where(expr); 

Это дает ту же ошибку.

PS: Вот как я заявляю, мой IQueryable, на всякий случай:

var query = from product in Entity.Products select product; 
+5

Пожалуйста, укажите * полное * описание исключения. –

+0

Это выглядит примерно так: http://stackoverflow.com/q/9513284/1039947 - просто попробуйте изменить 'keywords.All (product.Description.Contains)' to 'keywords.All (word => product.Description.Contains (word)) ' – kmp

ответ

0

Если вы используете EF Я сомневаюсь, что этот код будет работать таким образом. Я проверил это с общим списком в памяти, и, как и ожидалось, он работает правильно.

Попробуйте добавить предложения по одному по каждому ключевому слову. Это будет работать на стороне БД. Поставщики знают только, как сопоставлять определенные слова (например, Contains, StartsWith) в определенных контекстах и ​​записывать определенные способы.

var query = // your query 

// this is easy since you are doing an "AND" 
foreach(var word in keywords) { 
    var w = word; // need this! really! 
    query = query.Where(product => product.Description.Contains(w)); 
} 

Вот почему нам нужна переменная "ш":

Поскольку вы кончался с помощью 'за', вот как это будут искать других, которые могут увидеть этот ответ:

for(var i = 0; i < keywords.Length - 1; i ++) { 
    query = query.Where(x => x.Description.Contains(keywords[i])); 
} 
+0

Я собираюсь с предложением добавить предложение для каждого ключевого слова, используя цикл foreach, к которому я, к слову, благодарю вас. Однако он возвращает записи, соответствующие только ключевому слову LAST, и игнорируя первые несколько. foreach (ключевое слово строки по ключевым словам) { query = query.Where (product => product.Description.Contains (keyword)); } В основном, результат разрывает записи, содержащие ключевое слово LAST, а не все –

+0

Нет проблем. Мы делаем это * много * при выполнении динамических запросов, где пользователь может искать по параметру> 1 (например, в форме поиска) –

+0

Хорошо, исправлено. Я забыл добавить временную переменную. Вы нуждаетесь в этом, или только последний элемент будет захвачен LINQ (так что вы получите три аргумента where для одной и той же переменной. –

Смежные вопросы