【问题标题】:Anonymous types query or normal query in LINQLINQ 中的匿名类型查询或普通查询
【发布时间】:2010-07-29 14:39:30
【问题描述】:
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 };

这两个查询有什么区别。

如果我们使用anonymous-types,性能会提高还是还有其他差异?

【问题讨论】:

  • @muralidharan-tnj 顺便说一句。你好在stackoverflow上。在这里标记为解决您的问题的答案帖子是一个很好的做法。请记住它;)

标签: c# linq anonymous-types


【解决方案1】:

这两个查询有很大的不同。第一个返回您的实体的集合,第二个返回匿名类型的集合,其中有一个名为“x”的成员包含您的实体。

访问emps:

emps.First().SomeMember

访问emp1:

emp1.First().x.SomeMember

第一种方法是正确和自然的,第二种方法很奇怪,在我看来并不是你想要达到的。

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

【讨论】:

    【解决方案2】:

    大多数性能考虑因素可能与生成的 SQL 相关 - 此处不应更改。 (当然,您可以检查一下,但如果它有所作为,我会感到震惊。)

    当然,创建一个匿名类型的实例要比不创建一个实例需要更多的努力。我看不出为什么在这里使用匿名类型会使其性能更好 - 我希望它的性能会稍微差一点,但实际上并不是明显。

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

    【讨论】:

    • 我认为他只是举了一个简单的例子,去掉了大部分的复杂性。我可以看到匿名结果很有用的用例,尤其是当您想要返回 n 元组的集合时。它消除了声明“选择新元组(myThing, myThing,myThing,myThing,myThing,myThing)”的繁琐工作......
    • 当然.. 匿名类型并不是为了什么而发明的,并且有多种可能的用法很好。我仍然认为,他的意思是询问所提供的示例是否会产生性能差异。
    • @Aurélien:这就是为什么我明确指出匿名类型在哪里有用。但它们在所提供的唯一示例中没有有用,而且它们也没有带来性能优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多