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

huangapple go评论120阅读模式
英文:

Filter both master and details record and include details in master

问题

请考虑以下情况:

我有一个“Master”表格:

  1. Id Country
  2. --------------------
  3. 1 Ireland
  4. 2 Germany
  5. 3 Japan

和一个“Details”表格:

  1. Id MasterId SellAmount
  2. ------------------------------------
  3. 1 1 1000
  4. 2 1 2000
  5. 3 1 3000
  6. 4 2 500
  7. 5 2 1500
  8. 6 2 4000
  9. 7 3 5000
  10. 8 3 5500
  11. 9 3 1000
  12. 10 3 2000

这两个表格之间有一个外键关联。我想要筛选主表和细节表。例如:

  1. 主表 Id >= 2
  2. 细节表 SellAmount >= 3000

我想要包括符合上述条件的细节记录。

我编写了以下查询:

  1. var list = (from m in Master.Where(r => r.Id >= 2).Include("Details")
  2. join d in Details.Where(t => t.SellAmount >= 3000)
  3. on m.Id equals d.MasterId
  4. select m).ToList();

但它返回了所有6条主记录!!尽管在这些主记录中,我有所有的细节记录,但筛选没有发生。

我如何才能获得这个结果:

  1. 2 Germany
  2. 6 2 4000
  3. 3 Japan
  4. 7 3 5000
  5. 8 3 5500

谢谢。

英文:

Please consider this scanrio:

I have a Master table:

  1. Id Country
  2. --------------------
  3. 1 Ireland
  4. 2 Germany
  5. 3 Japan

and Detials table:

  1. Id MasterId SellAmount
  2. ------------------------------------
  3. 1 1 1000
  4. 2 1 2000
  5. 3 1 3000
  6. 4 2 500
  7. 5 2 1500
  8. 6 2 4000
  9. 7 3 5000
  10. 8 3 5500
  11. 9 3 1000
  12. 10 3 2000

There is a foreign key between these tow table. I want to filter both master and details tables. For example:

  1. Master Id >= 2
  2. Details SellAmount >= 3000

I want to inclsude those details records that have above criteria.

I wrote this query:

  1. var list = (from m in Master.Where(r=>r.Id >= 2).Include("Details")
  2. join d in Details.Where(t=>t.SellAmount >= 3000)
  3. on m.Id equals d.MasterId
  4. select m).ToList();

but it returned all 6 master records!!!! Although In those master records I had all details record and filtering didn't take place.

How can I have this result:

  1. 2 Germany
  2. 6 2 4000
  3. 3 Japan
  4. 7 3 5000
  5. 8 3 5500

Thanks

答案1

得分: 3

使用联接操作时,如果联接对中存在多个记录,则会将数据进行复制。

如果您使用EF Core,请使用适当的Include重写您的查询:

  1. var list = Master
  2. .Include(r => r.Details.Where(t => t.SellAmount >= 3000))
  3. .Where(r => r.Id >= 2)
  4. .ToList();

对于EF6,需要通过Select进行自定义投影到DTO类中:

  1. var list = Master
  2. .Where(r => r.Id >= 2)
  3. .Select(r => new MasterDTO
  4. {
  5. Id = r.Id,
  6. Country = r.Country,
  7. Details = r.Details.Where(t => t.SellAmount >= 3000).ToList()
  8. })
  9. .ToList();
英文:

Join operator multiplicate data if there is more than one record for joined pair.

If you use EF Core, rewrite your query using appropriate Include:

  1. var list = Master
  2. .Include(r => r.Details.Where(t => t.SellAmount >= 3000))
  3. .Where(r => r.Id >= 2)
  4. .ToList();

With EF6 it is needed custom projection via Select into DTO class

  1. var list = Master
  2. .Where(r => r.Id >= 2)
  3. .Select(r => new MasterDTO
  4. {
  5. Id = r.Id,
  6. Country = r.Country
  7. Details = r.Details.Where(t => t.SellAmount >= 3000).ToList()
  8. })
  9. .ToList();

huangapple
  • 本文由 发表于 2023年8月10日 20:13:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76875646.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定