简体   繁体   English

Entityframe Linq 使用 Max 和 Min

[英]Entityframe Linq using Max and Min

I am trying to do this boolean in Entityframe that will use the min and max value for a datetime field.我正在尝试在 Entityframe 中执行此布尔值,它将使用日期时间字段的最小值和最大值。 I can do it fine in SQL but In Entityframe I am not sure what I am missing.我可以在 SQL 中做得很好,但在 Entityframe 中我不确定我错过了什么。 The error is related to datetime between bool.该错误与 bool 之间的日期时间有关。

In SQL在 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

EF英孚

   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();

In your SQL, min and max only work because you're either doing a group by later on, or you're not selecting any non-aggregate values in your query.在您的 SQL 中, minmax仅起作用,因为您要么稍后进行group by ,要么未在查询中选择任何非聚合值。

In LINQ, you need to do the Group By first.在 LINQ 中,您需要先进行 Group By。

If you have nothing to group by (you want to put everything into one giant group), just use a constant, like 1 in your 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
}

Update更新

Based on the updated question:基于更新的问题:

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
}

I'd also recommend you look into using navigation properties to avoid all those explicit joins.我还建议您考虑使用导航属性来避免所有这些显式连接。 You'll likely find that it simplifies the query, once you start thinking of the problem from a LINQ-first perspective instead of trying to directly translate from SQL.一旦您开始从 LINQ 优先的角度思考问题,而不是尝试直接从 SQL 转换,您可能会发现它简化了查询。 That might turn into something more like this:这可能会变成更像这样的东西:

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