【问题标题】:How to populate an entity model using EF raw SQL queries and/or LinQ?如何使用 EF 原始 SQL 查询和/或 LinQ 填充实体模型?
【发布时间】:2017-06-14 12:36:14
【问题描述】:

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

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 做到这一点?

【问题讨论】:

    标签: entity-framework linq linq-to-entities rawsql entity-model


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢你,Teo!该死的,就这么简单。我的第二个问题呢?
    • @Tomo 实际上,如果您使用 EF,您应该能够将您的数据库结构映射到 EF 实体,然后使用它们而不是普通的 SQL 查询。检查this article 它显示了如何从现有数据库生成模型。
    • 我不希望这样,我更喜欢手动编写它,而不需要实体数据模型向导附带的不必要的东西。我在没有原始 sql 的情况下进行插入,但从 db 获取数据我使用原始 sql,但我应该使用 LinQ。
    • 你可以使用 linq to sql 处理这些东西,否则在从 db 获取数据后,你总是可以使用 linq to 对象和模型
    【解决方案2】:

    试试代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 2011-12-03
      • 2019-09-10
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多