c# - Entityframe Linq 使用 Max 和 Min
问题描述
我正在尝试在 Entityframe 中执行此布尔值,它将使用日期时间字段的最小值和最大值。我可以在 SQL 中做得很好,但在 Entityframe 中我不确定我错过了什么。该错误与 bool 之间的日期时间有关。
在 SQL 中
MeetingDate=case when Convert(varchar(10),min(md.StartDate),101)=Convert(varchar(10),max(md.StartDate),101) then Convert(varchar(10),min(md.StartDate),101) else Convert(varchar(10),min(md.StartDate),101)+' - '+Convert(varchar(10),max(md.StartDate),101) end
英孚
var listofMeeting = (from m in db.Meetings
join md in db.MeetingDates on m.MeetingId equals md.MeetingId
join mf in db.MeetingFiles on md.MeetingId equals mf.MeetingId
join mv in db.MeetingVersions on mf.MeetingFileId equals mv.MeetingFileId
join fm in db.FileManagers on mf.FileManagerId equals fm.FileManagerId
join g in db.vwGuidelinePanels on m.GroupId equals g.GroupId
where g.GroupId == groupID && mf.FileCategoryItemDictionaryId == 755
select new PresentationLayer.Models.GuidelineVersion
{
GroupId = g.GroupId,
MeetingId = md.MeetingId,
MeetingDate = (md.StartDate). == max(md.StartDate) ? md.StartDate : min(md.StartDate) == max(md.StartDate),
}).GroupBy(g => new
{
g.MeetingId,
g.GroupId
}).ToList();
解决方案
在您的 SQL 中,min
并且max
仅在您group by
稍后执行,或者您没有在查询中选择任何非聚合值时才起作用。
在 LINQ 中,您需要先进行 Group By。
如果您没有可分组的内容(您想将所有内容放入一个巨大的组中),只需使用一个常量,例如1
在您的group by
.
group md by 1 into g
let minDate = g.Min(md => md.StartDate)
let maxDate = g.Max(md => md.StartDate)
select new Meeting
{
MeetingDate = minDate == maxDate ? minDate.ToString() : minDate + " - " + maxDate
}
更新
基于更新的问题:
from m in db.Meetings
join md in db.MeetingDates on m.MeetingId equals md.MeetingId
join mf in db.MeetingFiles on md.MeetingId equals mf.MeetingId
join mv in db.MeetingVersions on mf.MeetingFileId equals mv.MeetingFileId
join fm in db.FileManagers on mf.FileManagerId equals fm.FileManagerId
join g in db.vwGuidelinePanels on m.GroupId equals g.GroupId
where g.GroupId == groupID && mf.FileCategoryItemDictionaryId == 755
group new { md.StartDate /* add other data you're need here as necessary */}
by new
{
g.MeetingId,
g.GroupId
} into grp
let minDate = grp.Min(md => md.StartDate)
let maxDate = grp.Max(md => md.StartDate)
select new PresentationLayer.Models.GuidelineVersion
{
GroupId = grp.Key.GroupId,
MeetingId = grp.Key.MeetingId,
MeetingDate = minDate == maxDate ? minDate.ToString() : minDate + " - " + maxDate
}
我还建议您考虑使用导航属性来避免所有这些显式连接。一旦您开始从 LINQ 优先的角度考虑问题,而不是尝试直接从 SQL 转换,您可能会发现它简化了查询。这可能会变成更像这样的东西:
from g in db.vwGuidelinePanels
from m in g.Meetings
where m.MeetingFiles.Any(mf => mf.FileCategoryItemDictionaryId == 755)
let minDate = m.MeetingDates.Min(md => md.StartDate)
let maxDate = m.MeetingDates.Max(md => md.StartDate)
select new PresentationLayer.Models.GuidelineVersion
{
GroupId = g.GroupId,
MeetingId = m.MeetingId,
MeetingDate = minDate == maxDate ? minDate.ToString() : minDate + " - " + maxDate
}
推荐阅读
- firebase - 为什么输出重复?
- vb.net - VB.NET 代码 MS Acess 作为数据库,成功编译后我的代码中出现错误。INSERT INTO 命令中的语法错误
- javascript - 检查Javascript中的字段是否为空?
- android - 不可调试的 Android 应用程序中的 Charles 代理
- android - 在 Xamarin Android Emulator 中通过网络摄像头模拟相机
- node.js - 发生错误:无效的 Lambda 响应:收到来自 Lambda 的空响应
- swift - 使用 UIDocumentPickerViewController 未出现 icloud 驱动器
- sql-server - 没有字段的非聚集索引的目的是什么?
- php - 使用单个输入上传多个图像时,Codeigniter 验证不起作用
- amazon-web-services - 我们可以为一组用户设置 AWS IAM 账户密码策略吗?