Entity Framework. Где метод цепочки - PullRequest
28 голосов
/ 04 ноября 2010

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

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();

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

Ответы [ 3 ]

41 голосов
/ 04 ноября 2010

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

Обновление

Я только что проверил приведенное выше утверждение с помощью 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 голосов
/ 04 ноября 2010

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

0 голосов
/ 04 ноября 2010

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

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