2017-06-14 69 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(); 

}