在EF6中将匿名类型转换为IEnumerable

我正在使用Entity Framework开发MVC应用程序。 我想从表中获取5列并以IEnumerable类型返回它们。 我的代码是:

IEnumerable n = new List(); 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 ‘隐式转换为’System.Collection.Generic.IEnumerable <>

我该如何解决?

首先,您不需要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 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 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 }); 

您需要简单地投射Type 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

更新:

由于它是entity framework中的映射实体,因此一种方法是首先投影匿名类型,然后投影模型类型,如下所示: –

 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 });