linq to sql несколько операторов Where (), не создающих ни одного выражения - PullRequest
2 голосов
/ 03 января 2011

Насколько я понимаю, следующий код:

IQueryable<Things> things = dataContext.Things.Take(10);
if (fromDate > new DateTime(1980, 1, 1))
    things = things.Where(a => a.InsertedDate > fromDate);
if (toDate < defaultDate)
    things = things.Where(a => a.InsertedDate < toDate);

должен привести к запросу (при условии, что даты проходят условия), например:

select top 10 [fields] from things
where inserteddate > '1/8/2010'
    and inserteddate < '1/12/2010'

Я прошел иподтвердил, что два оператора Where () установлены, но когда я вызываю things.ToList (), я получаю запрос:

select top 10 [fields] from things

Почему эти два оператора не включаются в фактический запрос?бежать?

Ответы [ 2 ]

4 голосов
/ 03 января 2011

Ваш код неверный. Вызов Queryable.Take должен быть на end , чтобы получить нужный запрос:

IQueryable<Things> things = dataContext.Things;

if (fromDate > new DateTime(1980, 1, 1))
{
    things = things.Where(a => a.InsertedDate > fromDate);
}

if (toDate < defaultDate)
{
    things = things.Where(a => a.InsertedDate < toDate);
}

things = things.Take(10);

Когда вы вызываете Take, сначала он находит первые десять элементов из всей базы данных, а затем оценивает причину Где только для этих 10 элементов. Результат обычно содержит менее десяти элементов.

Ваш неверный код теоретически может быть запущен как один запрос к базе данных:

SELECT [fields]
FROM
(
   SELECT TOP 10 [fields] FROM table1
) T1
WHERE inserteddate > '2010-01-08'
AND inserteddate < '2010-01-12'

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

2 голосов
/ 04 января 2011

Несмотря на то, что в моем примере было реализовано создание экземпляра var как IQueryable, мой реальный код делал это как IEnumerable. IEnumerable обрабатывает Where () иначе, по-видимому, так, что только первое выражение будет выполнено для БД, а все последующие - в памяти, в отличие от IQueryable Я виню методы расширения.

...