返回AnonymousType#1的数据类型
本文关键字:数据类型 AnonymousType#1 返回 | 更新日期: 2023-09-27 18:11:53
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>
如何正确完成?谢谢你。
您的查询在两种情况下都是正确的。然而,在第二种情况下,导致问题的是方法的返回类型。
你可以试试这个:
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();
}
这不起作用,因为List<T>
不是协变的——它是一个特定类型的列表,所以你不能向它添加任何对象。
- 创建一个具体的类型并使用它
-
将结果强制转换为object:
.Select(r => (object)(new { r.FirstName, r.LastName }))
-
将返回类型更改为
IEnumerable<object>
,其中是协变(因为您不能添加它)
选项1是最干净的,但需要额外的代码-选项2和3在查询端很容易,但在客户端需要反射或dynamic
(以及运行时漏洞,缺乏编译时安全性等)。