LINQ to Entity, используя оператор SQL LIKE - PullRequest
12 голосов
/ 22 марта 2010

У меня есть запрос LINQ to ENTITY, который извлекается из таблицы, но мне нужно иметь возможность создавать поиск «нечеткого» типа. Поэтому мне нужно добавить предложение where, которое выполняет поиск по фамилии, ЕСЛИ они добавляют критерии в поле поиска (Textbox, МОЖЕТ быть пустым - в этом случае он вытягивает ВСЁ)

Вот что у меня есть:

    var query = from mem in context.Member
                orderby mem.LastName, mem.FirstName
                select new
                {
                    FirstName = mem.FirstName,
                    LastName = mem.LastName,

                };

Это вытянет все из таблицы Member, которая находится в объекте Entity.

Тогда у меня есть дополнение к логике:

sLastName = formCollection["FuzzyLastName"].ToString();

if (!String.IsNullOrEmpty(sLastName))
   query = query.Where(ln => ln.LastName.Contains(sLastName));

Проблема в том, что при нажатии кнопки поиска ничего не возвращается (0 результатов). Я запустил запрос к SQL Server, который, как я ожидаю, произойдет здесь, и он возвращает 6 результатов.

Я ожидаю запроса:

SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName LIKE '%xxx%'

(когда ххх вводится в текстовое поле)

Кто-нибудь видит что-то не так с этим?

EDIT: исправлен запрос SELECT. Я хотел, чтобы он читал как "% xxx%" (NOT = "xxx")

Ответы [ 3 ]

15 голосов
/ 22 марта 2010

Я думаю, что вы хотите использовать функцию Contains() строкового параметра, например:

var query = from mem in context.Member
    where mem.LastName.Contains("xxx")
    orderby mem.LastName, mem.FirstName
    select new
    {
        FirstName = mem.FirstName,
        LastName = mem.LastName,
    };

Я думаю, вы также можете использовать StartsWith() и EndsWith(), что эквивалентно SQL 'xxx%' и '% xxx' соответственно.

3 голосов
/ 22 марта 2010

Добавьте свой «выберите новый» в запрос только после добавления предложения «Где».

Следовательно, добавьте предложение select, используя синтаксис вызова объекта, как вы делали с предложением where.

Не проверено, прошу прощения за небольшие ошибки, но общая концепция будет ...

   using( someContent sc = new someContent())
   {
      var query = sc.Member.OrderBy( i => i.LastName)
                    .ThenBy( i => i.FirstName);

      sLastName = formCollection["FuzzyLastName"].ToString();

      if (!String.IsNullOrEmpty(sLastName))
          query = query.Where(ln => ln.LastName.Contains(sLastName));

      query = query.Select( i => new
                {
                    FirstName = i.FirstName,
                    LastName = i.LastName,

                });
    }
1 голос
/ 22 марта 2010
SELECT mem.LastName, mem.FirstName FROM Members mem WHERE mem.LastName = 'xxx'

Это означает, что вы хотите, чтобы фамилия была равна 'xxx'.В вышеприведенном сообщении вы пишете, что фамилия должна содержать «xxx».

Чтобы получить его равным, вы должны написать:

if (!String.IsNullOrEmpty(sLastName))
   query = query.Where(ln => ln.LastName == sLastName);

Возможно, вам следует обратить внимание на регистр игнорирования:

if (!String.IsNullOrEmpty(sLastName))
   query = query.Where(ln => ln.LastName.Equals(sLastName, StringComparison.InvariantCultureIgnoreCase));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...