c# - 是否有使用查询语法在 LINQ 查询中执行 ToList 的巧妙方法?

标签 c# linq linq-to-sql syntax readability

考虑下面的代码:

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

最佳答案

您可以解决 GetOrCreateJobData 无法翻译成 SQL 的问题。

通过为指定的方法调用表达式实现自定义查询转换器,您可以控制 LINQ-to-SQL 解释方法的方式。有一篇很好的文章解释了这个过程并链接到可用的相关资源:http://www.codeproject.com/Articles/32968/QueryMap-Custom-translation-of-LINQ-expressions

或者,您可以将 GetOrCreateJobData 方法重构为使用表达式构建相同逻辑的扩展方法,以便 LINQ-to-SQL 可以自然地解释它。根据方法的复杂性,这可能比我的第一个建议更可行或更不可行。

关于c# - 是否有使用查询语法在 LINQ 查询中执行 ToList 的巧妙方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12515575/

相关文章:

c# - 同一功能中的多个锁

c# - 如何在 WinXP 中使用 IIS 5.1 发送邮件?

c# - 使用 Microsoft Bot Framework 将卡片附件添加到消息

c# - 我正在使用 linq 语句更新数据库中的数据

c# - linq to sql - 遍历表数据并设置值

c# - InputSimulator 不模拟鼠标点击

mysql - 我们可以使用 Skip()、Take() 和 OrderBy() 来控制 LINQ 表达式顺序吗

c# - NHibernate 3.0 IQueryable<T> 完全支持哪些 linq 函数

c# - Linq to SQL 一对多关系

c# - Linq to Sql 本地化查询