首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq向下选择五个表

Linq向下选择五个表
EN

Stack Overflow用户
提问于 2016-08-21 17:00:59
回答 1查看 56关注 0票数 1

我有五张桌子,它们是相关的

化学品->成分->解决方案->使用->项目

在Server上,我希望检索与化学品相关的数据项目以及中间表的一些数据。我可以使用以下查询(至少在LinqPad中)来完成这一任务:

代码语言:javascript
复制
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来向下钻取两个以上的表。

我使用EF6从Server获取数据,例如,化学品的edmx类。

代码语言:javascript
复制
    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。希望这能回答您的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-21 17:43:14

如果您提供了带有导航属性的类定义(使用联接的一个缺点是基数不太清楚),那就太好了。

但原则很简单。对于引用类型导航属性,您使用子句,对于集合类型- 从… (如果需要左外部连接语义,可以选择追加DefaultIfEmpty() )。

假设你的模型是这样的:

代码语言:javascript
复制
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; }
}

那么查询将如下所示:

代码语言:javascript
复制
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
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39066670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档