Как SQL-запрос в LINQ

Моя проблема заключается в следующем:

Я ищу решение в LINQ, которое переводит выражение LINQ в запрос SQL LIKE.

(Я знаю, что в LINQ я могу использовать Contains, StarsWidth, EndWidth вместо LIKE, но в моем случае это не очень хорошее решение, и если вы проверите сгенерированный скрипт sql, вы увидите, что он не использует LIKE)

Я нашел много статей, в которых используются методы System.Data.Linq.SqlClient.SqlMethods.Like, поэтому я написал свой запрос:

var query = from c in _context.prgCity where SqlMethods.Like( c.FullName, "%buda") select c.FullName + "|" + c.prgCountry.CountryName;

return query.ToList<string>();

Но когда запрос выполняется, я получаю следующее сообщение об ошибке:

«LINQ to Entities не распознает метод 'Boolean Like (System.String, System.String)', и этот метод не может быть преобразован в выражение хранилища».

Кто-нибудь может помочь мне, что я делаю неправильно?


person user295541    schedule 08.10.2010    source источник


Ответы (3)


Вы пытаетесь использовать SqlMethods.Like при переходе от LINQ к Entities. Согласно документации:

В настоящее время этот метод поддерживается только в запросах LINQ to SQL.

Вы так и не объяснили, почему Contains/StartsWith/EndsWith у вас не работают (и по моему опыту они действуют, переводятся в предложения LIKE).

person Jon Skeet    schedule 08.10.2010
comment
Я пытаюсь объяснить, почему метод Startwidth мне не подходит. - person user295541; 08.10.2010
comment
@ user295541: Я не нахожу ваше объяснение убедительным. StartsWith охватывает термин% , EndsWith охватывает %term, Contains охватывает %term%. Единственное время, которое вам понадобится, это если бы вы делали, te%rm. На самом деле, te%rm можно выполнить, используя StartsWith и EndsWith. Что-то вроде t%e%r%m не может. - person Brian; 08.10.2010

Вы можете написать свой запрос как:

var query = from c in _context.prgCity 
            where c.FullName.EndsWith("buda")
            select c.FullName + "|" + c.prgCountry.CountryName;
person Pablo Santa Cruz    schedule 08.10.2010

Используйте «Содержит» вместо SQLMethods.Like. Это будет работать.

person JackD    schedule 08.10.2010