过滤主记录和详细记录并在主记录中包含详细信息

问题描述 投票:0回答:1

请考虑这个扫描:

我有一张

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

谢谢

c# entity-framework linq linq-to-entities
1个回答
0
投票

如果连接对有多个记录,则连接运算符会乘以数据。

如果您使用 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();
© www.soinside.com 2019 - 2024. All rights reserved.