C# SQL到LINQ半复杂查询投影到ViewModel
我对sql非常熟悉,可以在专业领域勉强应付,但我对linq概念还是比较陌生,对lambda语法更不熟悉。下面是我的sql查询。。。我成功地加入了两个匹配id的表,并按特定状态筛选结果,仅根据日期选择最新条目 选择ma.*,mnh.note 来自马莎百货公司 在mnh.appid=ma.id上加入MerchNoteHist mnh 我在哪里[状态]!=6和mnh.CreatedDate=从 MerchantNoteHistories,其中appid=ma.Id 最终目标是将此查询投影到我的viewmodelC# SQL到LINQ半复杂查询投影到ViewModel,c#,sql,linq,lambda,automapper,C#,Sql,Linq,Lambda,Automapper,我对sql非常熟悉,可以在专业领域勉强应付,但我对linq概念还是比较陌生,对lambda语法更不熟悉。下面是我的sql查询。。。我成功地加入了两个匹配id的表,并按特定状态筛选结果,仅根据日期选择最新条目 选择ma.*,mnh.note 来自马莎百货公司 在mnh.appid=ma.id上加入MerchNoteHist mnh 我在哪里[状态]!=6和mnh.CreatedDate=从 MerchantNoteHistories,其中appid=ma.Id 最终目标是将此查询投影到我的view
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();
最后一步是在使用上述viewmodel的foreach循环中的视图中进行布局
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
}
经过研究、反复试验和午餐时间的努力,试图弄明白这一点。。。我花了整整7个小时来做这件事,真是不知所措。如果您有任何帮助,我们将不胜感激。您应该使用GroupJoin而不是Join,这将生成一组MerchNoteHist,我假设这是与此处匹配AppId的MerchantNoteHistory相同的表
然后,可以在函数的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
或者,您可以将其作为第二个Where子句:
.Where(x => x.Note.CreatedDate== _db.MerchNoteHist
.Where(y => y.AppId == x.Note.AppId).OrderByDescending(y => y.CreatedDate)
.First().CreatedDate)
请忽略前面的评论。。。当我需要换行时,我一直按回车键,它一直保存编辑。。。为什么。哪里不在这里工作?`MA=MA,User=MA.User.Wherem=>m.Status!=ApplicationStatus.Approved,Note=noteList.OrderByDowneringN=>n.CreatedDate.First`抱歉。。。尝试了多次编辑以获得正确的格式…很可能是因为ma.User不是IEnumerable。@user2544291听起来像是您正在寻找的,是将merchapp筛选为仅包含User.Status!=应用程序状态。已批准。您可以在GroupJoin之前执行此操作。我将更新我的帖子以包含此逻辑。