【问题标题】:Linq: Group by one column but must distinct other columnLinq:按一列分组,但必须区分另一列
【发布时间】:2021-02-11 22:21:13
【问题描述】:

在我的 linq 查询中,我想查询具有 visitId 和 deviceId 的服务表。我希望能够按访问分组,但 deviceId 不同。目前使用我的设置,我可以按 visitId 分组,但是当访问相同时,我无法在结果中显示 disitnct 设备。

from s in db.Services.Where(condition)
                 where s.Active && (hasSupportGeneralAccess || s.Visit.Site.Branch.Users.Any(u => u.Id == userId)) && s.Device != null
                 orderby s.Visit.Start descending
                 group s by s.Visit into newgroup
                 select newgroup.FirstOrDefault()

非常感谢任何帮助!

【问题讨论】:

  • 你能提供你所拥有的例子吗?什么是有效的?

标签: c# sql sql-server linq


【解决方案1】:

在您按访问分组后,您的所有实体(我猜是服务,因为它来自称为服务的集合)都在与给定访问关联的集合中。如果您想知道该列表中的不同设备,可以询问它们:

select newgroup.Select(x => x.Device).Distinct()

newgroup 就像List<Service>,服务的属性之一是设备。如果我给你一个List<Service> 并要求其中所有不同的设备,你会从列表中选择设备然后要求不同..这没有什么不同,除了你不是一个List<Service> '每次唯一访问都有一个列表 - 如果有 10 次访问,那么您需要处理 10 个List<Service>

【讨论】:

  • 感谢您的回答和澄清,有道理。我只是得到一个不能隐式转换类型 System.Linq.IQueryable 到 System.Collections.Generic.IEnumerable
  • 你将查询结果分配给什么?
  • 我会继续使用查询语法,但似乎没有多大意义,因为它没有 Distinct 操作
【解决方案2】:

在这种情况下,我们可以像下面这样对访问和设备的组合进行分组,以便我们为同一次访问获得重复的设备。

from s in db.Services.Where(condition)
where s.Active && (hasSupportGeneralAccess ||  s.Visit.Site.Branch.Users.Any(u => u.Id == userId)) && s.Device != null orderby s.Visit.Start descending
group s by (s.Visit + "." + s.Device) into newgroup
select newgroup.FirstOrDefault();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2022-01-07
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多