Linq to Entities - проекции против синтаксиса запросов против синтаксиса методов - PullRequest
2 голосов
/ 18 февраля 2011

Поскольку выражение запроса LINQ переводится «под прикрытием», чтобы вызывать те же методы, которые вызовет соответствующий запрос метода (по крайней мере, я так думаю), я ожидаю, что эти два запроса будут возвращать один и тот же тип. По какой-то причине, хотя это:

var result = from i in db.Invoices
             select new { i.InvoiceNum };

устанавливает результат как IQueryable<'a> с каждым членом, имеющим свойство InvoiceNum, тогда как этот

IQueryable<string> result2 = db.Invoices.Select(i => i.InvoiceNum);

Достаточно умен, чтобы вернуть IQueryable<string> (очевидно, так как он компилируется)

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

(это EF4, но то же самое происходит с linq-to-objects, и я предполагаю, что то же самое будет и с L2S)

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

Когда вы пишете new { }, вы создаете анонимный тип

попробовать

var result = from i in db.Invoices
             select i.InvoiceNum;

и вы увидите, что он возвращает ожидаемый вами тип.

2 голосов
/ 18 февраля 2011

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

var result = from i in db.Invoices
         select i.InvoiceNum;
1 голос
/ 18 февраля 2011

В первом утверждении вы создаете анонимный тип с одним свойством с именем «InvoiceNum».Это происходит потому, что вы используете синтаксис new { }.Этот анонимный тип не является строкой.Синтаксис метода эквивалентен:

var result = db.Invoices.Select(i => new { i.InvoiceNum });
...