-1

我想填充下面的实体模型:

public class MyModel
{
    public Abc Abc { get; set; }
    public Def Def { get; set; }        
    public List<Ghi> Ghi { get; set; }
}

public class Abc
{
    [Key]
    public int ID { get; set; }
    public string SomeString { get; set; }
}

public class Def
{
    [Key]
    public int ID { get; set; } 
    public string OtherString { get; set; }
}

public class Ghi
{
    [Key]
    public int ID { get; set; }
    public int DefID { get; set; }
    public string ThirdString { get; set; }
}

使用 EF 和一些原始 SQL 查询的数据:

using (var ctx = new ApplicationDbContext())
{
    var abc = ctx.Database.SqlQuery<Abc>(@"SELECT Abc.* FROM XY INNER JOIN Abc ON XY.AbcID = Abc.ID").ToList();
    var def = ctx.Database.SqlQuery<Def>(@"SELECT Def.* FROM XY INNER JOIN Def ON XY.DefID = Def.ID").ToList();
    var ghi = ctx.Database.SqlQuery<Ghi>(@"SELECT Ghi.* FROM XY INNER JOIN Def ON XY.DefID = Def.ID INNER JOIN Ghi ON Def.ID = Ghi.DefID").ToList();
}

但我不能这样做:

var myModel = new MyModel();
myModel.Abc = abc;
myModel.Def = Def;
myModel.Ghi = Ghi;

因为它会给我带来错误,例如

无法将类型“System.Collections.Generic.List”隐式转换为“MyProject.Models.Abc”

所以,问题是:

1)如何将列表转换为模型或更好地直接填充模型而不是使用原始 SQL 的列表?

2) 我知道 LinQ 可以用更少的代码让事情变得更容易......我怎样才能用 LinQ 做到这一点?

4

2 回答 2

1

你的错误是自我解释的,你应该这样写:

var myModel = new MyModel();
myModel.Abc = abc.FirstOrDefault();
myModel.Def = Def.FirstOrDefault();
myModel.Ghi = Ghi;

您试图将使用.ToList()扩展方法获得的集合放到定义为单个模型的属性中。

于 2017-06-14T12:38:54.033 回答
0

尝试代码:

var myModel = new MyModel();
using (var ctx = new ApplicationDbContext())
{
  myModel.ABC= (from p in ctx.XYZ
               join q in ctx.Abc on p.AbcId equals q.Id
               select q).FirstOrDefault();
 var result= (from p in ctx.XYZ
               join q in ctx.Def on p.DefId equals q.Id
               select q).ToList();
 myModel.DEF=result.FirstOrDefault();
 myModel.GHI=( from p in result
                join q in ctx.Ghi on p.Id equals q.DefId
                select q).ToList();

}
于 2017-06-14T13:41:47.353 回答