Рассмотрим приведенный ниже код:
StockcheckJobs =
(from job in (from stockcheckItem in MDC.StockcheckItems
where distinctJobs.Contains(stockcheckItem.JobId)
group stockcheckItem by new { stockcheckItem.JobId, stockcheckItem.JobData.EngineerId } into jobs
select jobs).ToList()
let date = MJM.GetOrCreateJobData(job.Key.JobId).CompletedJob.Value
orderby date descending
select new StockcheckJobsModel.StockcheckJob()
{
JobId = job.Key.JobId,
Date = date,
Engineer = (EngineerModel)job.Key.EngineerId,
MatchingLines = job.Count(sti => sti.Quantity == sti.ExpectedQuantity),
DifferingLines = job.Count(sti => sti.Quantity != sti.ExpectedQuantity)
}).ToList()
В середине есть ToList()
, потому что метод GetOrCreateJobData
не может быть переведен в sql.
В результате мне пришлось окружить первую часть моего запроса в скобках, чтобы сделать это, затем я использовал внешний запрос для завершения.
Я знаю, что я мог бы разделить это на две переменные, но я не хочу этого делать (это тоже внутри инициализатора объекта).
Есть ли какой-нибудь другой синтаксис, который я могу использовать для повышения удобочитаемости, предпочтительно удаление необходимости внешнего внутреннего запроса, когда мне нужно сделать ToList
(или иначе перейти к linq-to-objects) в в середине запроса linq?
В идеальном мире мне хотелось бы что-то вроде этого (насколько это возможно в любом случае):
StockcheckJobs =
from stockcheckItem in MDC.StockcheckItems
where distinctJobs.Contains(stockcheckItem.JobId)
group stockcheckItem by new { stockcheckItem.JobId, stockcheckItem.JobData.EngineerId } into jobs
MAGIC_DO_BELOW_AS_LINQ-TO-OBJECTS_KEYWORD_OR_SYNTAX
let date = MJM.GetOrCreateJobData(jobs.Key.JobId).CompletedJob.Value
orderby date descending
select new StockcheckJobsModel.StockcheckJob()
{
JobId = jobs.Key.JobId,
Date = date,
Engineer = new ThreeSixtyScheduling.Models.EngineerModel() { Number = jobs.Key.EngineerId },
MatchingLines = jobs.Count(sti => sti.Quantity == sti.ExpectedQuantity),
DifferingLines = jobs.Count(sti => sti.Quantity != sti.ExpectedQuantity)
};