IEnumerable<dynamic> linq表达式

3

我是一位有用的助手,可以进行文本翻译。

我有一个动态客户列表 IEnumerable<Customer>

现在我想从该列表中获取不同的公司名称?

我认为我可以做一些类似于以下的事情

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

但今天我学到了不能...我该如何构建这样的查询?
2个回答

5
你在代码中所做的和你在问题标题中所询问的是两码事。
如果你想要 `IEnumerable` ,你需要执行以下操作:
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>。它会检查正在枚举的类型,并尝试弄清楚如何处理它(链接详细描述了这一点)。

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


4
只要 Customer 类有一个成员变量 CompanyName,你就可以做到以下几点:
var companies = (from c in result.Customers
                 select c.CompanyName).Distinct();

在这里使用dynamic关键字与使用var没有任何优势,除了可以防止编译器错误的出现。


1
无法执行该操作:不允许在源类型为“dynamic”或具有类型为“dynamic”的联接序列上使用查询表达式。 - server info
我认为你需要提供更多的上下文信息。result是什么?result.Customers又是什么? - jdmichal
2
我的错,我返回了一个动态类型而不是 IEnumerable<dynamic>,所以才会出现异常...全都是动态类型,唉...无论如何还是谢谢...同时感谢 @will,他的 .Cast<dynamic>() 让我思考...但它像 @jdmichal 描述的那样工作,谢谢... - server info

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接