首页 > 解决方案 > 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();

标签: c#entity-frameworklinq

解决方案


在您的 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
}

推荐阅读