AnonymousType#1的正确返回数据类型是什么?
此代码正常运作。
var c = p.IQueryableGetAll()
.Where(r => r.Gender == "M")
.Select(r => new { r.FirstName, r.LastName })
.ToList();
但是当我把它放在一个函数中时,会发生错误。
public List<object> GetFirstNameAndLastNameOfMales()
{
var p = new Program();
return p.IQueryableGetAll()
.Where(r => r.Gender == "M")
.Select(r => new { r.FirstName, r.LastName })
.ToList();
}
这是错误
无法隐式转换类型
System.Collections.Generic.List<AnonymousType#1>
来System.Collections.Generic.List<object>
如何正确完成?谢谢。
答案 0 :(得分:2)
您在两种情况下的查询都是正确的。但是,导致第二种情况的问题是方法的返回类型。
你可以尝试这个:
return p.IQueryableGetAll()
.Where(r => r.Gender == "M")
.Select(r => new { r.FirstName, r.LastName }).ToList<Object>();
您收到此错误的原因是
Select(r => new { r.FirstName, r.LastName })
为序列中具有Gender==M
的每个元素选择一个匿名类型。查询末尾的.ToList()
会创建List
个对象,这些对象的类型为具有这两个属性的匿名类型。
更好的选择是创建一个包含这两个属性的类,让我们调用它Customer
,然后执行以下操作:
public List<Customer> GetFirstNameAndLastNameOfMales()
{
var p = new Program();
return p.IQueryableGetAll()
.Where(r => r.Gender == "M")
.Select(r => new Customer {
FirstName = r.FirstName,
LastName = r.LastName
}).ToList();
}
答案 1 :(得分:0)
它不起作用,因为List<T>
不是协变的 - 它是特定类型的列表,因此您无法向其添加任何对象。你可以:
将结果投射到对象:
.Select(r => (object)(new { r.FirstName, r.LastName }))
将返回类型更改为IEnumerable<object>
协变(因为您无法添加)
选项1是最干净的但需要额外的代码 - 选项2和3在查询方面很容易但需要在客户端进行反射或dynamic
(以及运行时漏洞,并且缺乏编译时安全性)等等。)。