Запрос LINQ-To-Entities с предложениями .Where не фильтруется должным образом - PullRequest
1 голос
/ 15 ноября 2010

Я делаю проект для учебы.Во время создания поисковой системы для моего приложения я заканчивал следующим кодом:

public List<Document> FindDocument(string docName, Company company,
                                   Department departament, Worker worker, 
                                   DateTime? enterDate, DateTime? expDate, 
                                   State state)
{
    IQueryable<Document> query = context.Documents
                .Include(p => p.Department)
                .Include(p => p.Company)
                .Include(p => p.State)
                .Include(p => p.Workers); 
    if (docName != null)
        query.Where(p => p.DocumentName.Contains(docName));
    if (company != null)
        query.Where(p => p.Company.Equals(company));
    if (departament != null)
        query.Where(p => p.Department.Equals(departament));
    if (worker != null)
        query.Where(p => p.Workers.Contains(worker));
    if (enterDate.HasValue)
        query.Where(p => p.EnterDate.Equals(enterDate.Value));
    if (expDate.HasValue)
        query.Where(p => p.ExpDate.Equals(expDate.Value));
    if (state != null)
        query.Where(p => p.State.Equals(state));

    return query.ToList();              
}

Критерии поиска являются необязательными, поэтому мне нужно проверить, является ли какой-либо из критериев пустымиПриложение выполнено так, что если этот критерий не используется, то его значение равно нулю.

Проблема этого запроса в том, что он всегда возвращает все документы, а не только документы, удовлетворяющие критериям.Я проверил с отладчиком во время выполнения, чтобы убедиться, что если указано значение, то тело оператора if будет оценено.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Вам необходимо изменить утверждения:

query.Where(...)

до

query = query.Where(...)

В противном случае вы ничего не меняете, просто вызываете функцию без получения результата

3 голосов
/ 15 ноября 2010

Ваша проблема в том, что вы предположили, что Enumerable.Where изменяет существующий запрос. Это не так - он возвращает новый запрос. Вам необходимо присвоить результат вызова Where обратно переменной query:

query = query.Where(p => ... );
1 голос
/ 15 ноября 2010

вам нужно немного изменить свой код.LINQ не изменяет коллекцию, но возвращает новое значение с результатом.

query = query.Where(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...