2015-02-03 6 views
0

Почему условие where не применяется в следующем коде? Когда я выполняю поиск, результаты не фильтруются. Когда я отлаживаю, searchString имеет значение, и выполнение выполняется через предложение _data.Where, но оно не возвращает результат фильтрации.LINQ to SQL - предложение WHERE отфильтровано

Что я здесь делаю неправильно?

IQueryable<UserViewModel> _data = (
    from a in context.aspnet_Users 
    join b in context.aspnet_Membership on a.UserId equals b.UserId 
    where b.IsApproved == true 
    select new UserViewModel 
    {         
     UserId = a.UserId, 
     UserName = a.UserName, 
     FirstName = a.FirstName, 
     LastName = a.LastName, 
     EmailAddress = b.Email         
    }) 
    .OrderBy(a => a.FirstName) 
    .ThenBy(b => b.LastName); 

if (!String.IsNullOrEmpty(searchString)) 
{     
    _data = _data 
     .Where(x => x.FirstName.Contains(searchString)) 
     .Where(y => y.UserName.Contains(searchString)) 
     .Where(y => y.LastName.Contains(searchString)) 
     .Where(y => y.EmailAddress.Contains(searchString)); 
} 
+0

Я предполагаю, что имеет значение только второй запрос. Этот запрос пытается найти записи, в которых имена FirstName * и * UserName * и * LastName * и * Email все начинаются с той же строки. Я думаю, что вам нужен запрос, который проверяет просто, если какой-либо из них начинается с строки поиска –

+0

Как вы подтвердили этот результат? Что такое нефильтрованные данные, какова строка поиска и каковы отфильтрованные данные? Вы уверены, что используете строку поиска, которая существует в * все четыре * этих полей для любой записи? – David

ответ

0

Я подозреваю, что это делает намного больше «фильтрация», чем вы ожидаете:

_data = _data.Where(x => x.FirstName.Contains(searchString)) 
      .Where(y => y.UserName.Contains(searchString)) 
      .Where(y => y.LastName.Contains(searchString)) 
      .Where(y => y.EmailAddress.Contains(searchString)); 

Это требует, чтобы searchString существовать в все четыре из этих полей. Поэтому, если вы ищете, скажем, «Дэвид», тогда он не сможет найти мою запись, потому что мой LastName не содержит эту строку.

Возможно, вы использовали логический или вместо логических и? Что-то вроде этого:

_data = _data.Where(x => x.FirstName.Contains(searchString) || 
         x.UserName.Contains(searchString) || 
         x.LastName.Contains(searchString) || 
         x.EmailAddress.Contains(searchString)); 
+0

да, вы правы, и я пропустил эту часть. –

1

Путь второй запрос записывается проверки для записей, где все отфильтрованные поля начинаются с поиска строки, т.е. для пользователей, чьи FirstName и LastName и UserName и Email все начать с ту же строку.

Я думаю, что вы хотели, запрос, проверить, начинается ли какие-либо из этих полей с поисковой строкой, например:

_data = _data.Where(x => x.FirstName.Contains(searchString) || 
         x.UserName.Contains(searchString) || 
         x.LastName.Contains(searchString) || 
         x.EmailAddress.Contains(searchString)); 
Смежные вопросы