C# 将SQL语句转换为Linq/Lambda查询
Im使用MEF并执行一个任务,该任务仅在返回超过1条记录时才需要与聚合函数分组。我需要将开始时间的最大值和结束时间的最小值分组到一个记录中,就像我的sql在restuled任务中产生的结果一样C# 将SQL语句转换为Linq/Lambda查询,c#,sql,linq,lambda,C#,Sql,Linq,Lambda,Im使用MEF并执行一个任务,该任务仅在返回超过1条记录时才需要与聚合函数分组。我需要将开始时间的最大值和结束时间的最小值分组到一个记录中,就像我的sql在restuled任务中产生的结果一样 var ohs = await Bl.UoW.Repositories.OperatingHours .FindInDataSourceAsync(oh => ((oh.ProductId == productTypeId && oh.StateId ==
var ohs = await Bl.UoW.Repositories.OperatingHours
.FindInDataSourceAsync(oh => ((oh.ProductId == productTypeId
&& oh.StateId == state)
|| (oh.StateId == complianceHours.State)));
当返回超过1条记录时,下面的SQL基本上满足了我的需要
SELECT
StateId,
MAX(ComplianceHourStart),
MIN(ComplianceHourEnd)
FROM
OperatingHours
GROUP BY
StateId
HAVING
StateId = 'CA'
所以当超过1时,我可以进一步过滤,但不确定如何实现最大值和最小值
if (ohs != null && ohs.Count() > 1)
{
//
ohs = ohs.GroupBy(x => x.State).Max(x => x.ComplianceHourStart?...
}
谢谢像这样的东西应该可以做到:
ohs = ohs.GroupBy(x => x.State)
.Select(g => new
{
//You need to make a choice on StateId, here... First one?
StateId = g.First().StateId,
MaxComplianceHourStart = g.Max(o => o.ComplianceHourStart),
MinComplianceHourEnd = g.Min(o => o.ComplianceHourEnd)
});
从SQL中,这应该是关闭的:
var result = context.OperatingHours
.GroupBy(oh => oh.StateId)
.Select(oh => new {StateId = oh.Key,
MaxStart = oh.Max(x => x.ComplianceHourStart),
MinEnd = oh.Min(x => x.ComplianceHourEnd)});
…虽然我不确定在限制状态id列(组键)时为什么要分组。以下内容也应足够:
var result = context.OperatingHours
.Where(oh => oh.StateId == 'CA')
.Select(oh => new {MaxStart = oh.Max(x => x.ComplianceHourStart),
MinEnd = oh.Min(x => x.ComplianceHourEnd)});