C# IEnumerable<;动态>;linq表达式

C# IEnumerable<;动态>;linq表达式,c#,dynamic,c#-4.0,linq-to-objects,C#,Dynamic,C# 4.0,Linq To Objects,我有动态客户列表IEnumerable 现在我想从那张名单上找出公司的名字 我想我可以做一些类似的事情 dynamic cur = (from c in result.Customers select g.CompanyName).Distinct(); 但是今天我知道我不能。。。 如何构建这样的查询?只要Customer类有一个成员CompanyName,您肯定可以执行以下操作: var companies = (from c in result

我有动态客户列表
IEnumerable

现在我想从那张名单上找出公司的名字

我想我可以做一些类似的事情

 dynamic cur = (from c in result.Customers
                      select g.CompanyName).Distinct();
但是今天我知道我不能。。。
如何构建这样的查询?

只要
Customer
类有一个成员
CompanyName
,您肯定可以执行以下操作:

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

在这里使用
dynamic
关键字而不是
var
没有任何好处,除了它可以防止出现编译器错误之外。

在代码中做什么和在问题标题中问什么是两件不同的事情

如果要
IEnumerable
,必须执行以下操作:

var companies = (from c in result.Customers
                 select c.CompanyName).Distinct();
IEnumerable<dynamic> cur = (from c in result.Customers
               select g.CompanyName).Cast<dynamic>().Distinct();
IEnumerable cur=(来自结果中的c.Customers
选择g.CompanyName).Cast().Distinct();
结果中的c中的
。客户选择g.CompanyName
返回
IEnumerable

Cast()
返回
IEnumerable

Distinct()
返回可枚举项的不同成员

Distinct()
默认情况下使用默认的相等比较器。这将检查正在枚举的类型,并尝试找出如何处理它(链接对此进行了详细描述)


除非默认的相等比较器无法处理动态处理的类型,否则这一切都可以按照公布的方式工作。在这种情况下,您必须使用接受自定义相等比较器的覆盖。

不能这样做:不允许源类型“dynamic”或类型为“dynamic”的联接序列上的查询表达式。我认为您需要提供更多上下文。什么是
结果
?什么是
result.Customers
?我的错误是我返回了一个dynamic而不是IEnumerable,这就是为什么我得到了异常。。。这都是动态的叹息。。。无论如何谢谢你。。。也谢谢@will his.Cast()让我想到。。。但它的工作原理就像@jdmichal所描述的,谢谢…很好的解释。谢谢你的链接。