【问题标题】:Linq select five tables downLinq 向下选择五个表
【发布时间】:2023-03-18 15:05:01
【问题描述】:

我有五个相关的表,例如

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

在 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
}

我不想使用连接,而是使用导航属性,但我不知道如何使用多个 Select 或 SelectMany 来深入了解 2 个以上的表。

我正在使用 EF6 从 SQL Server 获取数据,化学品的 edmx 类是 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。希望这能回答你的问题。

【问题讨论】:

  • 你能显示导航属性吗?

标签: c# wpf linq


【解决方案1】:

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

但原理很简单。对于引用类型导航属性,您使用 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
...

【讨论】:

  • 嗨@Hucky,我不得不拒绝您的编辑,因为不允许在答案中回复,但我已阅读您的回复并非常感谢!所以不客气,很高兴有帮助。你可以做的(不一定)是,你可以在这里看到What should I do when someone answers my question?。干杯。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多