请考虑这个扫描:
我有一张
Master
桌子:
Id Country
--------------------
1 Ireland
2 Germany
3 Japan
和
Detials
表:
Id MasterId SellAmount
------------------------------------
1 1 1000
2 1 2000
3 1 3000
4 2 500
5 2 1500
6 2 4000
7 3 5000
8 3 5500
9 3 1000
10 3 2000
这些拖表之间有一个外键。我想过滤主表和详细表。例如:
Master Id >= 2
Details SellAmount >= 3000
我想包含那些具有上述条件的详细记录。
我写了这个查询:
var list = (from m in Master.Where(r=>r.Id >= 2).Include("Details")
join d in Details.Where(t=>t.SellAmount >= 3000)
on m.Id equals d.MasterId
select m).ToList();
但是它返回了所有 6 个主记录!!!!虽然在那些主记录中我有所有详细信息记录并且没有进行过滤。
我怎样才能得到这个结果:
2 Germany
6 2 4000
3 Japan
7 3 5000
8 3 5500
谢谢
如果连接对有多个记录,则连接运算符会乘以数据。
如果您使用 EF Core,请使用适当的
Include
重写您的查询:
var list = Master
.Include(r => r.Details.Where(t => t.SellAmount >= 3000))
.Where(r => r.Id >= 2)
.ToList();
对于 EF6,需要通过
Select
自定义投影到 DTO 类
var list = Master
.Where(r => r.Id >= 2)
.Select(r => new MasterDTO
{
Id = r.Id,
Country = r.Country
Details = r.Details.Where(t => t.SellAmount >= 3000).ToList()
})
.ToList();