我有五张相关的表格,如
化学品 - >成分 - >解决方案 - >用法 - >项目
在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。克。
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
...