SQL to LINQ半复杂查询投影到ViewModel

时间:2018-01-15 21:01:28

标签: c# sql linq lambda automapper

我知道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小时内完成了这个问题并且在我的智慧结束时。任何帮助都将不胜感激。

2 个答案:

答案 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)