2011-03-21 127 views
3

我有客户IEnumerable<Customer>IEnumerable的<dynamic> LINQ表达式

现在我想有从该名单上disctinct公司名称的动态列表?

我想我可以做类似

dynamic cur = (from c in result.Customers 
         select g.CompanyName).Distinct(); 

但今天学到,我不能...... 我怎么能建立这样的查询?

+0

你不能只使用var? – Manatherin 2011-03-21 11:23:44

回答

4

只要Customer类有一个成员CompanyName,你绝对可以做到以下几点:

var companies = (from c in result.Customers 
       select c.CompanyName).Distinct(); 

没有优势,使用的dynamic关键字在var这里,比一个事实,即它会阻止其他编译器出现错误。

+1

不能这样做:查询表达式超过源类型'dynamic'或类型'dynamic'的连接序列是不允许的 – 2011-03-21 11:44:18

+0

我认为你需要提供更多的上下文。什么是'结果'?什么是'结果。客户'? – jdmichal 2011-03-21 11:49:09

+2

我的错我回到了一个动态的,而不是IEnumerable 这就是为什么我得到了例外......这是所有的动态叹息......谢谢无论如何......也谢谢@他的.Cast ()让我觉得......但没有它的作品像@ jdmichal已经描述,谢谢... – 2011-03-23 20:24:56

5

你在代码中做什么以及你在问题标题中问什么是两个不同的东西。

如果你想IEnumerable<dynamic>你必须做到以下几点:

IEnumerable<dynamic> cur = (from c in result.Customers 
       select g.CompanyName).Cast<dynamic>().Distinct(); 

from c in result.Customers select g.CompanyName回报IEnumerable<string>
Cast<dynamic>()返回IEnumerable<dynamic>
Distinct()返回可枚举的不同成员。

Distinct()默认使用默认的相等比较器EqualityComparer<T>。这将检查被枚举的类型并试图找出如何处理它(链接详细描述了这一点)。

这一切都像广告一样工作,除非动态处理的类型不能由默认的相等比较器处理。在这种情况下,您必须使用采用自定义相等比较器的重写。

+0

很好的解释。并感谢您的链接。 – 2011-06-27 15:33:19