Подтвердить что ты не робот

Entity Framework. Где цепочка методов

Есть ли разница между этими двумя способами запроса контекста?

Firm firm = base.context.Firms
            .Where(f => f.SomeId == someId)
            .Where(f => f.AnotherId == anotherId)
            .FirstOrDefault();

Firm firm = base.context.Firms
            .Where(f => f.SomeId == someId && f.AnotherId == anotherId)
            .FirstOrDefault();

Кажется, что цепочка отлично подходит для выполнения условия И. Я не верю, что вы можете связывать OR-заявления. Есть ли причина предпочитать один за другим или сценарии, когда один лучше/эффективнее?

4b9b3361

Ответ 1

Они должны давать одинаковый конечный результат (если я не ошибаюсь), но я считаю, что второе является более читаемым и лучше показывает исходное намерение.


Обновление

Я просто проверил вышеуказанное утверждение, используя LINQPad. Оба запроса будут, по сути, иметь тот же SQL.

Например:

context.SomeTable.Where(c => c.ParentId == null)
                 .Where(c => c.Name.Contains("F"))
                 .Select(c => c.Name);

Выдает:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL)

Что такое тот же SQL, который создается:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F"))
                 .Select(c => c.Name);



Вы также можете немного сжать вещи (что я считаю предпочтительным по тем же причинам, что и выше):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                                                  && f.AnotherId == anotherId);

Ответ 2

Моя догадка заключается в том, что до тех пор, пока вы работаете с IQueryable (поскольку, вероятно, существуют ваши коллекции контекстов), использование цепочечных расширений и полного предложения предиката достигает того же самого. Это связано с тем, что IQueryable допускает отсроченное выполнение, поэтому по сути один и тот же SQL генерируется за кулисами.

Ответ 3

Вы можете отлаживать код и видеть SQL, который генерируется в результате каждого из них. Я бы подумал, что это превращается в тот же запрос.