我知道sql足够专业,但我仍然对linq概念不熟悉,甚至不太熟悉lambda语法。下面是我的SQL查询...我成功加入2个匹配id的表格,并按特定状态过滤我的结果,并根据日期仅选择最新的条目。
select ma.* , mnh.note
from MerchApps ma
join MerchNoteHist mnh on mnh.appid = ma.id
where ma.[Status] != 6 and mnh.CreatedDate = (select max(CreatedDate) from
MerchantNoteHistories where appid = ma.Id)
最终目标是将此查询投影到我的viewmodel。
public class ViewModelListItem
{
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public ApplicationStatus Status { get; set; }
public string RecentNote { get; set; }
... //other things that aren't related to the question
}
问题是:找到正确的最大使用量。
我对LINQ lambda语法的最佳尝试,我在研究后能够拼凑起来:
_db.MerchApps
.Join(_db.MerchNoteHist,
ma => ma.Id,
note => note.AppId,
(ma, note) => new { MA = ma, Note = note })
.Include(x => x.MA.User)
.Where(x => x.MA.Status != ApplicationStatus.Approved)
.Include(x => x.Note.Note)
.Where(x => x.Note.CreatedDate == Max(x.Note.CreatedDate) //<--Issue is here, because I can't find the correct max usage.
.ProjectTo<ViewModelListItem>(_mapperConfig)
.OrderBy(x => x.Status).ThenBy(x => x.CreatedDate).ToListAsync();
最后一步是将所有内容放在使用上述视图模型的foreach循环的视图中。
经过研究和反复试验,并在午餐时间尝试解决这个问题......我在这7小时内完成了这个问题并且在我的智慧结束时。任何帮助都将不胜感激。
答案 0 :(得分:2)
您应该使用GroupJoin
代替Join
,这会产生一组MerchNoteHist
(我假设这与MerchantNoteHistories
的表格相同)匹配AppId。
然后,您可以在函数的Max
中使用聚合(resultSelector
)。
这里大概是您的代码应该是什么样的:
_db.MerchApps
.Where(ma => ma.User.Status != ApplicationStatus.Approved)
.GroupJoin(
_db.MerchNoteHist,
ma => ma.Id,
noteList => note.AppId,
(ma, noteList) => new
{
MA = ma,
Note = noteList.OrderByDescending(n=>n.CreatedDate).First()
})
//rest of your logic here
答案 1 :(得分:0)
或者你可以把它作为第二个Where子句:
.Where(x => x.Note.CreatedDate== _db.MerchNoteHist
.Where(y => y.AppId == x.Note.AppId).OrderByDescending(y => y.CreatedDate)
.First().CreatedDate)