【问题标题】:Complex Nested Linq Query复杂的嵌套 Linq 查询
【发布时间】:2015-09-21 21:14:28
【问题描述】:

我正在查找所有处于已提交状态且在给定日期(“天数”)之前提交的费用报告。 有没有更好(更快、更简单、更清洁)的方法来做到这一点?

var startDate = DateTime.Now.AddDays(-days);
using (var context = new Context())
{
    var data = context.tExpenseReports
                    .AsNoTracking()
                    .Where(r => context.tTransactionStatuses.FirstOrDefault(s => s.TransactionStatusID == r.tTransactions.Max(t => t.TransactionStatusID)) != null ?
                                context.tTransactionStatuses.FirstOrDefault(s => s.TransactionStatusID == r.tTransactions.Max(t => t.TransactionStatusID)).TransactionStatusID == IDConstants.TRANSACTION_STATUS_SUBMITTED &&
                                context.tTransactionHistories.FirstOrDefault(s => s.TransactionStatusID == r.tTransactions.Max(t => t.TransactionStatusID)).CreatedDatetime < startDate
                                : false)
              .Execute()
              .Select(Mapper.Map<tExpenseReport,ExpenseReport>)
              .ToArray();
              return data;
          }
    }

【问题讨论】:

  • 用文字表达的要求看似简单,但您的查询却变得复杂,看起来您的设计错误。此外,最好显示您的相关模型以便更好地理解(以不同的方式查询它)。 ExpenseReport 表和包含所有提交报告的另一个表之间应该有one-one 关系。导入后,实体ExpenseReport 应具有引用提交表中的条目的非空导航属性。关于创建时间,除非一个报表有多个创建时间,否则我们可以直接在 ExpenseReport 里面做一列。

标签: c# .net entity-framework linq linq-to-sql


【解决方案1】:

我不确定我是否理解你所有的方法

但我认为它会起作用

var sata1=( from r in context.tExpenseReports.AsNoTracking()
                       let max = r.tTransactions.Max(t => t.TransactionStatusID)
                       let s = context.tTransactionStatuses.FirstOrDefault(s => s.TransactionStatusID == max)
                       where s!=null
                       where s.CreatedDatetime < startDate

                       select r);
          return  sata1 .Execute()
              .Select(Mapper.Map<tExpenseReport,ExpenseReport>)
              .ToArray();

【讨论】:

  • 感谢您的建议。您没有包含 tTransactionHistories,但是当我以相同的方式添加它们时,查询确实返回相同的结果集。示例: let h = context.tTransactionHistories.FirstOrDefault(s => s.TransactionStatusID == r.tTransactions.Max(t => t.TransactionStatusID)) where s != null && h != null
  • 在你的例子中你应该写let h = context.tTransactionHistories.FirstOrDefault(s =&gt; s.TransactionStatusID ==max)
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2019-01-05
  • 1970-01-01
相关资源
最近更新 更多