左联接表ID和子查询的最大ID

时间:2019-09-24 13:36:58

标签: linq entity-framework-core

我正在使用.NET core,并尝试编写Linq查询以列出案例。我尝试将3个表合并在一起: 案例-包括CaseID和CaseStatusID CaseStatuses-包括CaseStatusID(一个案例具有其中之一) CaseStatusHistory-包括CaseStatusHistoryID,CaseID,CaseStatusID(一个Case中有很多)。

我可以在CaseStatusID上轻松加入Cases和CaseStatuses,但是不确定如何在CaseStatusHistoryID =选择MAX(CaseStatusHistoryID)WHERE的CaseID和CaseStatusID匹配的子查询上加入CaseStatusHistory。我什至可以稍后在结果中选择CaseStatusHitory,但不确定如何。

这是我需要转换的东西

SELECT
            c.CaseID,
            csh.DateTimeAdded
        FROM dbo.Cases c
        JOIN dbo.CaseStatuses cs
            ON c.CaseStatusID = cs.CaseStatusID
        LEFT JOIN dbo.CaseStatusHistory csh
            ON csh.CaseStatusHistoryID =
            (
                SELECT MAX(CaseStatusHistoryID)
                FROM dbo.CaseStatusHistory
                WHERE CaseID = c.CaseID
                    AND cs.CaseStatusID = c.CaseStatusID
            )

这是我到目前为止在Linq中所拥有的

            IQueryable<CasesViewModel> objs =
                from c in _db.Cases
                from cs in _db.CaseStatuses.Where(cs => cs.CaseStatusId == c.CaseStatusId.Value).DefaultIfEmpty()
                select new CasesViewModel
                {
                    CaseID = c.CaseId,
                    CaseStatus = cs.CaseStatus
                    //StatusChangeDate = csh.DateTimeAdded
                };

我需要添加类似的内容

From csh In CaseStatusHistories
    Where
    (
        From _csh In CaseStatusHistories
        Where _csh.CaseID = c.CaseID AndAlso _csh.CaseStatusID = c.CaseStatusID
        Select _csh.CaseStatusHistoryID
    ).Max = csh.CaseStatusHistoryID

这是我到目前为止的内容,但未返回任何结果-似乎超时了。

IQueryable<CasesViewModel> objs =
                from c in _db.Cases
                from cs in _db.CaseStatuses.Where(cs => cs.CaseStatusId == c.CaseStatusId.Value).DefaultIfEmpty()
                from rg in _db.RepairingGarages.Where(rg => rg.RepairingGarageId == c.RepairingGarageId.Value).DefaultIfEmpty()
                from rgb in _db.Businesses.Where(rgb => rgb.BusinessId == rg.BusinessId.Value).DefaultIfEmpty()
                from ec in _db.EngineeringCompanies.Where(ec => ec.EngineeringCompanyId == c.EngineeringCompanyId.Value).DefaultIfEmpty()
                from ecb in _db.Businesses.Where(ecb => ecb.BusinessId == ec.BusinessId.Value).DefaultIfEmpty()
                from csh in _db.CaseStatusHistory.Where(csh => csh.CaseStatusHistoryId ==
                (
                    from _csh in _db.CaseStatusHistory
                    where _csh.CaseId == c.CaseId && _csh.CaseStatusId == c.CaseStatusId.Value
                    select _csh.CaseStatusHistoryId
                ).Max()).DefaultIfEmpty()
                select new CasesViewModel
                {
                    CaseID = c.CaseId,
                    RepairingGarage = rgb.BusinessName,
                    Engineer = ecb.BusinessName,
                    CaseStatus = cs.CaseStatus,
                    StatusChangeDate = csh.DateTimeAdded
                };

我只需要获取StatusChangeDate(即CaseStatusHistory表中的DateTimeAdded)。案例可以不止一次处于相同状态,因此对于一个特定案例,我只需要具有最高CaseStatusHistoryID的DateTimeAdded即可。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这似乎回答了我的问题

IQueryable<CasesViewModel> objs =
                from c in _db.Cases
                from cs in _db.CaseStatuses.Where(cs => cs.CaseStatusId == c.CaseStatusId.Value).DefaultIfEmpty()
                from rg in _db.RepairingGarages.Where(rg => rg.RepairingGarageId == c.RepairingGarageId.Value).DefaultIfEmpty()
                from rgb in _db.Businesses.Where(rgb => rgb.BusinessId == rg.BusinessId.Value).DefaultIfEmpty()
                from ec in _db.EngineeringCompanies.Where(ec => ec.EngineeringCompanyId == c.EngineeringCompanyId.Value).DefaultIfEmpty()
                from ecb in _db.Businesses.Where(ecb => ecb.BusinessId == ec.BusinessId.Value).DefaultIfEmpty()
                select new CasesViewModel
                {
                    CaseID = c.CaseId,
                    RepairingGarage = rgb.BusinessName,
                    Engineer = ecb.BusinessName,
                    CaseStatus = cs.CaseStatus,
                    StatusChangeDate =
                    (
                        from _csh in _db.CaseStatusHistory
                        where _csh.CaseId == c.CaseId && _csh.CaseStatusId == cs.CaseStatusId
                        orderby _csh.CaseStatusHistoryId descending
                        select _csh.DateTimeAdded
                    ).FirstOrDefault()
                };

不参加的唯一麻烦是我不确定现在是否可以按此日期排序。还有更好的主意吗?谢谢。