将匿名类型转换为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>> '

我怎么解决它?

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

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