Я использую ядро .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 для конкретного случая.Большое спасибо за любую помощь.