LINQ中的匿名类型查询或普通查询

时间:2010-07-29 05:54:02

标签: c# linq anonymous-types

var emps = from x in DB  
           where x.ID = 100 
           select x;

var emp1 = from x1 in DB
           where x1.ID = 100 
           select new { x };

这两个查询之间有什么区别。

如果我们使用匿名类型会增加性能还是其他任何差异?

2 个答案:

答案 0 :(得分:4)

这两个查询存在很大差异。首先返回实体的集合,第二个返回匿名类型的集合,其中包含一个名为“x”的成员,包含您的实体。

访问emps:

emps.First().SomeMember

访问emp1:

emp1.First().x.SomeMember

第一种方式是正确和自然的,第二种方式是奇怪的,在我看来并不是你想要实现的目标。

同样不是这样,在这里使用匿名类型会提高性能。无论如何,必须构建对象表示实体,但这次你以不太友好的形式获得它。

答案 1 :(得分:3)

大多数性能考虑可能都是基于SQL生成的 - 这不应该在这里改变。 (当然,你可以检查一下,但如果它有所作为,我就会错开。)

当然,创建一个匿名类型的实例需要花费更多的努力。我看不出为什么在这里使用匿名类型会使其执行更好的任何原因 - 我希望它执行得非常糟糕,但实际上显然不是

更重要的是,我无法看到后者如何添加除了不必要的附加间接层之外的任何内容。它会使你的代码略微不清楚,没有任何好处。当您想要将单独的值组合在一起时,或者只查询表中列的一个子集时,匿名类型很有用 - 但单属性匿名类型很少有用。