2017-06-14 71 views
-1

我要填写以下实体模型:如何使用EF原始SQL查询和/或LinQ填充实体模型?

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

回答

1

你的错误是自explainary你应该写这样的:

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

你试图把集合的GET与.ToList() extenstion方法属性,定义为单一的模式。

+0

谢谢,张志贤!该死的,这很容易。我的第二个问题呢? – Tomo

+0

@Tomo实际上,如果您使用EF,您应该能够将您的数据库结构映射到EF实体,然后使用它们代替普通的SQL查询。检查[本文](https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/database-first-development/creating-the-web-application)它显示了如何生成模型从现有的数据库。 –

+0

我不想那样,我更喜欢手动编写它,而不需要实体数据模型向导附带的不必要的东西。我做插入没有原始的SQL,但从数据库获取数据我使用原始的SQL,但我应该使用LinQ来代替。 – Tomo

0

try代码:

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

}