问题描述
SELECT T1.ID,T1.UserId,T1.ServerId,T1.diskId,T1.Date_ PrevIoUsDate_,T1.Row,MIN(T2.Date_) AS Date_,DATEDIFF(MINUTE,T1.Date_,MIN(T2.Date_)) AS MinutesDiff
FROM IesLogs T1
LEFT JOIN IesLogs T2
ON T1.diskId = T2.diskId
where T1.diskId = 2 AND T2.Date_ > T1.Date_ AND T1.Row = T2.Row
GROUP BY T1.ID,T1.[Row]
ORDER BY T1.diskId,T1.[Row],T1.Id
我获得的数据比我预期的要多。
var result = (
from i in context.IesLogs
join i2 in context.IesLogs
on i.diskId equals diskId into i2left
from i3 in i2left.DefaultIfEmpty()
where
i.UserId == userId
&& i3.Date > i.Date
&& i.Row == i3.Row
group i3 by new {i.Id,i.ServerId,i.diskId,i.Row,PrevIoUsDate = i.Date,i3.Date} into logs
orderby logs.Key.diskId,logs.Key.Row,logs.Key.Id ascending
select new IesLogStatisticsDto
{
Id = logs.Key.Id,ServerId = logs.Key.ServerId,diskId = logs.Key.diskId,PrevIoUsDate = logs.Key.PrevIoUsDate,Date = logs.Min(x => x.Date),Row = logs.Key.Row,DateDiff = Convert.ToInt32((logs.Min(x => x.Date) - logs.Key.PrevIoUsDate).TotalMinutes)
}).ToList();
我应该得到 6 个数据时却得到了 12 个。我该如何解决?
我认为我获得大量数据的原因是上面代码博客中的(i3.Date > i.Date
) 但我必须实现这一行。
解决方法
您的 LINQ 查询分组错误。您必须从分组键中删除 i3.Date
。
稍微重构:
var query =
from i in context.IesLogs
join i2 in context.IesLogs
on i.DiskId equals diskId into i2left
from i2 in i2left.DefaultIfEmpty()
where
i.UserId == userId
&& i2.Date > i.Date
&& i.Row == i2.Row
group i2 by new {i.Id,i.ServerId,i.DiskId,i.Row,PreviousDate = i.Date} into logs
orderby logs.Key.DiskId,logs.Key.Row,logs.Key.Id ascending
select new IesLogStatisticsDto
{
Id = logs.Key.Id,ServerId = logs.Key.ServerId,DiskId = logs.Key.DiskId,PreviousDate = logs.Key.PreviousDate,Date = logs.Min(x => x.Date),Row = logs.Key.Row,DateDiff = Convert.ToInt32((logs.Min(x => x.Date) - logs.Key.PreviousDate).TotalMinutes)
};