2016-08-21 21 views
1

我有像LINQ的選擇五桌下來

化學品相關的五個表 - >成分 - >解決方案 - >用法 - >項目

一個SQL-Server上,我想要檢索的數據預測,與化學品以及中間表的一些數據有關。我可以用下面的查詢(至少在LinqPad)做到這一點:

from c in Chemicals 
    join i in Ingredients on c.Chem_ID equals i.Chem_ID into TempTab01 
    from tt01 in TempTab01.DefaultIfEmpty() 
     join s in Solutions on tt01.Sol_ID equals s.Sol_ID into TempTab02 
      from tt02 in TempTab02.DefaultIfEmpty() 
       join u in Usages on tt02.Sol_ID equals u.Sol_ID into TempTab03 
        from tt03 in TempTab03.DefaultIfEmpty() 
         join pro in Projects on tt03.Study_ID equals pro.Study_ID into TempTab04 
         from tt04 in TempTab04.DefaultIfEmpty() 
select new 
{ 
c_ChemID = c.Chem_ID, 
c_Name = c.Name, 
i_ChemID = (int?)tt01.Chem_ID, 
i_Sol_id = (int?)tt01.Sol_ID, 
i_IngredID = (int?)tt01.Ingred_ID, 
tt01.Amount, 
s_SolID = (int?)tt02.Sol_ID, 
s_SolName = tt02.SolName, 
u_SolID = (int?)tt03.Sol_ID, 
u_StudyID = (int?)tt03.Study_ID, 
pro_StudyID = (int?)tt04.Study_ID, 
pro_StudyNo = tt04.StudyNo, 
pro_ProjectName = tt04.ProjectName 
} 

我不想使用連接,但導航屬性,而不是,但我不知道如何使用幾種選擇或的SelectMany鑽下降到2個以上的表格。

我使用EF6從SQL Server獲取數據,化學品的edmx-class是e。 G。

public long Chem_ID { get; set; } 
    public string Name { get; set; } 

    public virtual Person Person { get; set; } 
    public virtual Project Project { get; set; } 

    public virtual ICollection<Ingredient> Ingredients { get; set; } 
    public virtual ICollection<Usage> Usages { get; set; } 

即化學品具有1:M相對於配料,配料到解= 1:1,解用法= 1:m和用法對項目= 1:1。希望這回答你的問題。

+0

您可以顯示導航屬性? –

回答

2

如果你已經提供了具有導航屬性的類定義(使用連接的一個缺點是基數不太清楚),那將會很好。

但原理很簡單。對於引用類型導航屬性,使用let子句,對於集合類型 - from(如果需要左外連接語義,可選地追加DefaultIfEmpty())。

因此,假如你的模型是這樣的:

class Chemical 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
} 

class Ingredient 
{ 
    public Chemical Chemical { get; set; } 
    public Solution Solution { get; set; } 
} 

class Solution 
{ 
    public ICollection<Ingredient> Ingredients { get; set; } 
    public ICollection<Usage> Usages { get; set; } 
} 

class Usage 
{ 
    public Solution Solution { get; set; } 
    public Project Project { get; set; } 
} 

class Project 
{ 
    public ICollection<Usage> Usages { get; set; } 
} 

那麼查詢會是這樣:

from c in db.Chemicals 
from i in c.Ingredients.DefaultIfEmpty() 
let s = i.Solution 
from u in s.Usages.DefaultIfEmpty() 
let p = u.Project 
... 
+0

嗨@Hucky,我不得不拒絕你的編輯,因爲它不允許在答案中回覆,但我已經閱讀你的回覆,並且非常感謝!所以你很受歡迎,很高興幫助。你可以做什麼(不一定),當然,你可以在這裏看到[當有人回答我的問題時我應該怎麼做?](http://stackoverflow.com/help/someone-answers)。乾杯。 –