我正在使用Entity Framework开发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>>
'
我该如何解决?
答案 0 :(得分:4)
首先,您不需要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)
但事实并非如此,因此您需要使用AsEnumerable
从EF中断到内存中,然后在此之后创建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()
,那么你可能最好只选择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 });
。那,要获得你真正想要的类型列表。
如果您使用的是异步代码,那么我们也会在await之后放置它:
{{1}}
答案 1 :(得分:3)
您只需简单地预测类型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
});