考虑下面的代码:
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()
由于GetOrCreateJobData
方法无法转换成SQL,因此在中间出现了ToList()
。
因此,我不得不将查询的第一部分用括号括起来,然后使用外部查询来完成剩余部分。
我知道我可以将其拆分为两个变量,但我不想这样做(这是在对象初始化器中完成的)。
当我需要在linq查询中间执行ToList
(或以其他方式转到linq-to-objects)时,是否有其他语法可以增加可读性,最好消除内部和外部查询的需求?
在理想的情况下,我希望像这样(尽可能接近):
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)
};
MDC.StockcheckItems.AsEnumerable()
会有帮助吗?可以强制将“source”查询为Linq-To-Objects吗? - Jeppe Stig NielsenNullReferenceException
好运。 - Jesse WebbIQueryable<T>
或IEnumerable<T>
的结果。你必须调用扩展方法才能得到类似List<T>
的东西。这是本地代码和数据库代码并存的副作用...你必须在某个地方承受代价。 - Peter Ritchie