Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL到LINQ半复杂查询投影到ViewModel_C#_Sql_Linq_Lambda_Automapper - Fatal编程技术网

C# SQL到LINQ半复杂查询投影到ViewModel

C# 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

我对sql非常熟悉,可以在专业领域勉强应付,但我对linq概念还是比较陌生,对lambda语法更不熟悉。下面是我的sql查询。。。我成功地加入了两个匹配id的表,并按特定状态筛选结果,仅根据日期选择最新条目

选择ma.*,mnh.note 来自马莎百货公司 在mnh.appid=ma.id上加入MerchNoteHist mnh 我在哪里[状态]!=6和mnh.CreatedDate=从 MerchantNoteHistories,其中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();
最后一步是在使用上述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之前执行此操作。我将更新我的帖子以包含此逻辑。