Оставлено соединение идентификатора таблицы с максимальным идентификатором из подзапроса - PullRequest
0 голосов
/ 24 сентября 2019

Я использую ядро ​​.NET и пытаюсь написать запрос Linq для получения списка дел.У меня есть 3 таблицы, которые я пытаюсь объединить: Cases - включает CaseID и CaseStatusID CaseStatuses - включает CaseStatusID (у Case есть одна из них) CaseStatusHistory - включает CaseStatusHistoryID, CaseID, CaseStatusID (у Case есть много из них).

Я могу легко присоединиться к Cases и CaseStatuses по CaseStatusID, но я не уверен, как присоединить CaseStatusHistory к CaseStatusHistoryID = подзапросу для выбора MAX (CaseStatusHistoryID) WHERE совпадений CaseID и CaseStatusID.Я мог бы даже выбрать 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, который является DateTimeAdded в таблице CaseStatusHistory.Случаи могут быть в одном и том же состоянии более одного раза, поэтому мне просто нужно DateTimeAdded с наивысшим значением CaseStatusHistoryID для конкретного случая.Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 24 сентября 2019

Похоже, что это ответ на мой вопрос

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()
                };

Единственная проблема с неприсоединением состоит в том, что я не уверен, смогу ли я отсортировать по этой дате сейчас.Есть идеи получше?Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...