2016-08-21 24 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)。干杯。 –