Я начинаю использовать LINQ в целом (до сих пор toXML и toSQL). Я видел, что иногда существует два или больше способа достигнуть тех же результатов. Возьмите этот простой пример, насколько я понимаю оба возврата точно то же самое:
SomeDataContext dc = new SomeDataContext();
var queue = from q in dc.SomeTable
where q.SomeDate <= DateTime.Now && q.Locked != true
orderby (q.Priority, q.TimeCreated)
select q;
var queue2 = dc.SomeTable
.Where( q => q.SomeDate <= DateTime.Now && q.Locked != true )
.OrderBy(q => q.Priority)
.ThenBy(q => q.TimeCreated);
Идея состоит в том, что существует два способа выразить то же самое; я понимаю, что первый метод имеет некоторые ограничения и что "запись через точку" - больше завершенное, но помимо этого, является там какими-либо другими преимуществами?
"Точечную" нотацию обычно называют синтаксисом Лямбды. Первая нотация идет многими именами, но я обычно называю ее синтаксисом запроса.
я работаю над командой 10 разработчиков, и мы спорим подробно, о котором мы должны использовать в качестве стандарта. В целом более закаленное (с LINQ) разработчики мигрируют к синтаксису Лямбды, но существуют значительные исключения.
Лямбда более кратка, но работает, несколько соединений таблицы являются кошмаром. Соединения являются просто намного более чистыми с синтаксисом запроса. Оборот - то, что существует много операций LINQ, которые только существуют в синтаксисе Лямбды: Единственный (), Сначала (), количество () и т.д.
Так, использование, с чем Вы чувствуете себя больше всего комфортно и понимаете что, как Вы приобретаете опыт, Ваше предпочтение, вероятно, изменится. Существует большое значение в способности считать обоих и конечно, будут ситуации, где необходимо использовать и то, и другое. Другие ситуации предоставят themselve одному стилю по другому. В конце все это переводится в тот же исполняемый код.
Ну, 'точечная' нотация может быть намного короче. Возьмите:
var result = from p in dc.Products
where p.Id > 5
select p;
или:
var result = dc.Products.Where(p => p.Id > 5);
я предпочитаю последнего, так как это намного короче, и более читаемо.
Я использую, какой бы ни синтаксис более читаем для моего запроса в зависимости от конкретного случая.
, Где возможно, я стараюсь не смешивать и соответствовать этим двум, хотя иногда это хорошо (если это - единственный вызов к First()
в конце запроса, например). Задержанное выполнение означает, что столь же эффективно использовать выражение запроса и присвоить результат переменной и затем использовать запись через точку использование что переменная:
var query = from x in y
orderby z
group x by x.Name into groups
// etc
select foo;
var page = query.Skip(50).Take(10);
, Поскольку другие сказали, запросите выражения, просто переводятся в "нормальный" C# 3 без выражений запроса, таким образом, нет никакого штрафа за то, что сделали это.
Они компилируют в тот же код, или довольно сначала каждый сначала переводится во второе и затем скомпилированный.
Вы правы, что различие - то, что первая версия является более чистой, но более ограниченной. Во втором уже можно, например, использовать существующих делегатов, например:
Func<int, bool> isEven = i => i%2 == 0;
Enumerable.Range(10).Where(isEven).ToList().ForEach(Console.WriteLine);
Я считаю лямбда-нотацию более аккуратной и лаконичной. Меня просто раздражает то, что если у вас есть лямбда-выражение где угодно внутри вызова метода, вы не можете изменять код на лету в режиме отладки ...