繁体   English   中英

Entityframe Linq 使用 Max 和 Min

[英]Entityframe Linq using Max and 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 中, minmax仅起作用,因为您要么稍后进行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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM