Linq to Entities - 针对查询语法与方法语法的预测

时间:2011-02-17 22:10:21

标签: c# linq-to-sql entity-framework-4 linq-to-entities

由于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到对象也是如此,我猜测L2S也会发生同样的情况)

3 个答案:

答案 0 :(得分:5)

当你写new { }时,你正在创建一个匿名类型

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

你会看到它返回你期望的类型。

答案 1 :(得分:2)

那些不一样,第一个是返回anonymousn类型,使它们与你需要的第一个相同:

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

答案 2 :(得分:1)

在第一个语句中,您将创建一个匿名类型,其中包含一个名为“InvoiceNum”的属性。发生这种情况是因为您使用new { }语法。那个匿名类型不是String。等效的方法语法是:

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