2016-08-12 37 views
0

我有这个疑问可以使左实体框架中加入无数据集

return _ctx.TestPackages.Where(s => s.Id == TestPackageId). 
     Join(_ctx.TestPackageReportDetails, s => s.Id, d => d.TestPackageId, (s, d) => new { reportDetail = d, testpack = s }). 
     Join(_ctx.TestPackageReports, p => p.reportDetail.TestPackageReportId, o => o.Id, (p, o) => new { combined = p, report = o }) 
     .ToList() 

正如你可以看到我的查询,使3台TestPackagesTestPackageReportDetailsTestPackageReports之间的连接。当我在TestPackageReportDetails中使用相同的testpackageid有多个记录时,结果在输出中重复3次。我怎样才能避免重复?

我应该在TestPackageReportDetails和TestPackages之间进行左连接吗?如果是,我该怎么做?

+2

EF是一个ORM,而不是SQL的替代品你的*实体*应该有关系,以便你*不需要使用连接。这意味着你的'TestPackage'类应该有'Reports'集合'TestPackageReport'应该有'Details'集合。你可能只需要加载适当的包。其余的将被懒惰地装载。或者你可以添加一对'Include()'调用来加载它们 –

+0

最后一次连接中的选择器不应该是另一种方式吗?其次,为什么不使用Query-Syntax(_ctx.TestPackages ....中的s)使代码清晰易读? – user3185569

+2

换句话说,你应该能够编写'_ctx.TestPackages.Where(s => s.Id == TestPackageId);'或'_ctx.TestPackages.Include(“TestPackageReport”).include(“TestPackageReport.TestPackageReportDetail”) 。 Where(s => s.Id == TestPackageId);' –

回答

1

既然你只选择三个字段(如图所示再次编辑你的答案,并删除之前选择)那么你可以这样做:

(from s in _ctx.TestPackages 
join d in _ctx.TestPackageReportDetails, 
on s.Id equals d.TestPackageId 
join r in _ctx.TestPackageReports 
on s.Id equals r.reportDetail.TestPackageReportId 
where s.Id == TestPackageId 
select new 
{ 
    s.Id, 
    s.packageNumber, 
    s.Size, 
    s.TestPackageOrder 
}).Distinct().ToList().Select(m=> new ..) // continue your normal selection 
+0

我收到此错误:其他信息:LINQ to Entities不能识别方法'System.String get_Item(Int32)'方法,并且此方法无法转换为存储表达式。 –

+0

@EhsanAkbar检查编辑的答案。 – user3185569

2

如果你的目的是要渴望负载你应该使用报告的详细信息,然后.INCLUDE:

_ctx.TestPackages.Include(t=>t.TestPackageReportDetails.TestPackageReports).Where(s => s.Id == TestPackageId);