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

时间:2015-09-21 11:02:42

标签: c# asp.net-mvc entity-framework linq

我正在使用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>>'

我该如何解决?

2 个答案:

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