Запрос EntityFramework Linq

Я не могу понять, что не так со следующим запросом:

var tmp = dbset.AsEnumerable<mytable>().Where(
c=>c.Barcode.Contains("11") && c.Description.Contains("EW") );
return tmp;

Должно ли это быть таким же, как:

select * from mytable
where Barcode like '%11%' and Description like '%EW%';

Если я запускаю это на сервере sql, я получаю четыре строки, как и должно быть, но не когда я запускаю запрос linq, я получаю 0 строк.

Пожалуйста, помогите мне. Это довольно простой запрос, и он вызывает у меня такую ​​головную боль. Большое Вам спасибо


person ASR    schedule 14.02.2012    source источник


Ответы (3)


dbset.AsEnumerable<mytable>()...

Не делайте этого!

Вы заставляете все свои данные извлекаться из базы данных перед проверкой условия Where.

Кроме этого, не совсем понятно, почему ваш запрос не работает. Ваш синтаксис правильный. Я предполагаю, что данные на самом деле не выглядят так, как вы думаете. Либо так, либо вы ожидаете, что like %EW% будет соответствовать чему-то без учета регистра, и, поскольку предложение Where оценивается LINQ to Objects, вы не получаете такого поведения.

person StriplingWarrior    schedule 14.02.2012
comment
ТС за разъяснение. На самом деле я этого не делаю. Я использую PredicateBuilder из LinqKit, и это была проблема с циклом for, который я использовал для построения выражения. Я просто написал этот linq-запрос, чтобы быстро проверить, как, по моему мнению, должен выглядеть конечный запрос, и он не сработал. Спасибо за подсказку, это добавило мне знаний об EF - person ASR; 14.02.2012
comment
@ user875615: Нет проблем. Для дальнейшего использования я бы посоветовал вам использовать LINQPad, чтобы увидеть, какой SQL генерируется вашими запросами. Это простой способ определить, где может быть проблема с вашим запросом. - person StriplingWarrior; 14.02.2012

Вы забыли получить данные, сделайте это:

var tmp = dbset.AsEnumerable<mytable>().Where(
c=>c.Barcode.Contains("11") && c.Description.Contains("EW") );
return tmp.ToList();

Также не звоните AsEnumerable в ближайшее время, используйте его, как показано ниже:

var tmp = ctx.mytable.Where(
                  c=>c.Barcode.Contains("11") && c.Description.Contains("EW") );
return tmp.ToList();
person Saeed Amiri    schedule 14.02.2012
comment
Кроме того, не думайте, что AsEnumerable вам поможет, потому что сам IEnumerable ленив и вернет элемент только при повторении (например, ToList()) :) - person Vladislav Zorov; 14.02.2012
comment
да, толист работал для этого конкретного запроса (с AsEnumerable). Огромное спасибо - person ASR; 14.02.2012
comment
@VladislavZorov, но AsEnumerable извлекает данные. - person Saeed Amiri; 14.02.2012
comment
@ user875615, используйте мой второй стиль. сначала извлекаются все данные с сервера, а затем выполняется обработка, что не очень хорошо. - person Saeed Amiri; 14.02.2012

Запустите запрос только с одним condition? " c.Barcode.Contains("11") ".

Этот код должен работать нормально.

person Ammar    schedule 14.02.2012
comment
Да, я могу, проблема была не в Linq, а в выражении PredicateBuilder, которое я пытался сгенерировать динамически. - person ASR; 14.02.2012