【问题标题】:Translating my SQL Query to c# linq/lambda. Multiple parameter GroupBy将我的 SQL 查询转换为 c# linq/lambda。多参数 GroupBy
【发布时间】:2016-05-20 13:32:04
【问题描述】:

我整个上午都在纠结这个问题,不知道如何在 C# 中解决。

我的SQL查询如下:

select a.CourseID,
a.UserID 
from audit a
inner join results r on a.UserID = r.UserID
inner join Course c on a.CourseID = c.CourseID
where c.CourseType = 9 and a.Guid = 'A123F123D123AS123123'
and a.Result = 'Passed' and r.Class = 'Maths'
group by a.CourseID, a.UserID
order by a.UserID

返回正是我想要的,但我似乎无法将它翻译成 linq 格式。 (这里使用的格式是我目前工作所需的格式,所以请就这种格式提出建议)

到目前为止,我有以下内容:

var audits = auditRepository.Get(a => a.Course.CourseType == 9 && a.GUID == this.Company.GUID && a.Result == "Passed", null, null,
a => a.Course, a => a.User)
.Join(resultsRepository.Get(r => r.GUID == this.Company.GUID && r.Class == class),
a => a.UserID,
r => r.UserID,
(a, r) => new Audit
{
    User = a.User,
    Course = a.Course,
    Result = a.Result,
    Timestamp = a.Timestamp,
    AuditID = a.AuditID,
    UserID = a.UserID
}
)
.OrderByDescending(o => o.Timestamp)
.GroupBy(u => new { u.User, u.Course })

.Select(grp => grp.ToList())
.ToList();

但是这会返回重复项。

感谢任何建议,谢谢

H

【问题讨论】:

标签: c# sql linq lambda


【解决方案1】:

代替

.Select(grp => grp.ToList())

只选择每个组中的第一个元素以排除重复项:

.Select(grp => grp.First())

如果您还需要计数:

.Select(t => new{grp = t.First(),cnt = t.Count()} )

修复:

.Select(t => new { grp = t.First(), cnt = t.Select(s => s.AuditID).Distinct().Count() })

【讨论】:

  • 谢谢,这有帮助,但是在我的 json 中,我需要其中一个字段为 p.Count().ToString(),在这种情况下不可用。
  • @bjjrolls:我还添加了一种计数方式。
  • 非常感谢。从今天早上 9 点半开始,我就一直在思考这个问题。我已经用我的修复更新了你的回复
猜你喜欢
  • 2021-05-30
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多