将匿名类型转换为IEnumerable<>在EF6
本文关键字:EF6 IEnumerable 类型转换 | 更新日期: 2023-09-27 18:13:55
我正在使用实体框架开发MVC应用程序。我想从表中获得5列,并以IEnumerable类型返回它们。我的代码是:
IEnumerable<MST> n = new List<MST>();
n = db.MSTs.Select(x => new { x.Id, x.Code, x.Desc, x.L1, x.L2 }).OrderBy(h => h.Code).ToList();
但是它给了我错误
不能隐式转换类型'System.Collection.Generic.List
<Anonymous#1>
'到'System.Collection.Generic.IEnumerable<<MST>>
'
我怎么解决它?
首先,您不需要ToList()
,因为您不需要列表:
db.MSTs
.Select(x => new { x.Id, x.Code, x.Desc, x.L1, x.L2 })
.OrderBy(h => h.Code)
现在您确实需要类型为MST
。如果这是EF知道的类型,您可以将其直接包含在Select
:
db.MSTs
.Select(x => new MST{ Id = x.Id, Code =x.Code, Desc = x.Desc, L1 =x.L1, L2 =x.L2 })
.OrderBy(h => h.Code)
但是它不是,所以你需要从EF到内存中的AsEnumerable
,然后在那之后创建MST
:
IEnumerable<MST> n = db.MSTs
.Select(x => new { x.Id, x.Code, x.Desc, x.L1, x.L2 }).OrderBy(h => h.Code)
.AsEnumerable()
.Select(x => new MST{ Id = x.Id, Code =x.Code, Desc = x.Desc, L1 =x.L1, L2 =x.L2 });
(如果你确实需要ToList()
,你可以用它来代替AsEnumerable()
,但你可能最好在所有这些之后放置一个最终的ToList()
,以获得你真正想要的类型的列表)。
如果你使用的是异步代码,那么我们同样可以把它放在await:
之后IEnumerable<MST> n = (await db.MSTs
.Select(x => new { x.Id, x.Code, x.Desc, x.L1, x.L2 })
.OrderBy(h => h.Code)
.ToListAsync())
.Select(x => new MST{ Id = x.Id, Code =x.Code, Desc = x.Desc, L1 =x.L1, L2 =x.L2 });
您需要简单地投影类型MST
而不是匿名类型:-
n = db.MSTs.Select(x => new MST
{
Id = x.Id,
Code = x.Code,
Desc = x.Desc,
L1= x.L1,
L2 = x.L2
}).OrderBy(h => h.Code);
在MST
中提供了所有这些属性。此外,它不应该是一个映射实体,它应该是一个DTO。
同样,这里不需要ToList
,因为Select
返回IEnumerable<T>
。
更新:
因为它是实体框架中的映射实体,一种方法是先投影匿名类型,然后是模型类型,像这样:-
n = db.MSTs.Select(x => new
{
x.Id,
x.Code,
x.Desc,
x.L1,
x.L2
}).OrderBy(h => h.Code)
.AsEnumerable()
Select(x => new MST
{
Id = x.Id,
Code = x.Code,
Desc = x.Desc,
L1= x.L1,
L2 = x.L2
});