【发布时间】: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