C# 在执行LINQ到实体查询时填充实体中的属性
我有一个实体类型,我们称之为事务,由实体框架版本1创建。我添加了以下属性:C# 在执行LINQ到实体查询时填充实体中的属性,c#,entity-framework,C#,Entity Framework,我有一个实体类型,我们称之为事务,由实体框架版本1创建。我添加了以下属性: public partial class Transaction { public int CurrentMaxRevisionNumber { get; set; } } 我有以下疑问: public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate) { var query = from t in
public partial class Transaction
{
public int CurrentMaxRevisionNumber { get; set; }
}
我有以下疑问:
public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate)
{
var query = from t in Repository.Transaction
let currentMaxRevisionNumber =
Repository.Transaction.Where(t1 => t1.TransactionId == t.TransactionId)
.Max(t1 => t.RevisionNumber)
where t.StartDate >= startDate
&& t.EndDate < endDate)
select t;
return query.ToList();
}
public List GetTransactions(DateTime startDate,DateTime endDate)
{
var query=来自存储库中的t。事务
让currentMaxRevisionNumber=
Repository.Transaction.Where(t1=>t1.TransactionId==t.TransactionId)
.Max(t1=>t.RevisionNumber)
其中t.StartDate>=StartDate
&&t.EndDate
我们试图实现的业务规则如下:-应在原始日期为交易创建一条新记录,该记录的代码表明该记录已被软删除,修订号增加。
-交易的新记录将在新日期创建,修订号增加 问题在于,确定何时处理事务的流程是一天一天连续完成的,事务从一个日期移动到另一个日期,有时不断返回到原始日期。这可能导致给定事务的最大修订号为特定日期的修订号,而不是事务的最大修订号。这就是我尝试在查询中使用“let”的原因 现在是问题:
-如何使用查询填充在分部类中创建的CurrentMaxRevisionNumber属性?
-因为在任何给定的日期都可能有数百笔交易,所以是否有其他方法可以在不必对每笔交易进行查询的情况下实现这一点
谢谢你的帮助。所以我尝试的第一件事是使用反模式选择n+1,这是一个可怕的解决方案,但至少这向我们表明,通过获得正确的数据,问题将得到解决。有点像:
public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate)
{
var list = (from t in Repository.Transaction
where t.StartDate >= startDate
&& t.EndDate < endDate)
select t).ToList();
foreach(var item in list)
{
item.CurrentMaxRevisionNumber = Repository.Transaction.
Where(t => t.TransactionId == item.TransactionId).
Max(t => t.RevisionNumber);
}
return list;
}
public List GetTransactions(DateTime startDate,DateTime endDate)
{
var list=(来自Repository.Transaction中的t)
其中t.StartDate>=StartDate
&&t.EndDatet.TransactionId==item.TransactionId)。
最大值(t=>t.修正数);
}
退货清单;
}
由于明显的原因,该解决方案不可接受,因此我们提出以下建议:
public List<Transaction> GetTransactions(DateTime startDate, DateTime endDate)
{
var query = (from t in Repository.Transaction
where t.StartDate >= startDate
&& t.EndDate < endDate)
select new
{
OriginalTransaction = t,
CurrentMaxRevisionNumber = Repository.Transaction.
Where(t1 => t1.TransactionId == t.TransactionId).
Max(t1 => t1.RevisionNumber);
}).ToList();
foreach(var item in list)
{
item.OriginalTransaction.CurrentMaxRevisionNumber = item.CurrentMaxRevisionNumber;
}
return list.Select(items => items.OriginalTransaction).ToList();
}
public List GetTransactions(DateTime startDate,DateTime endDate)
{
var query=(来自Repository.Transaction中的t
其中t.StartDate>=StartDate
&&t.EndDatet1.TransactionId==t.TransactionId)。
最大值(t1=>t1.修订编号);
}).ToList();
foreach(列表中的变量项)
{
item.OriginalTransaction.CurrentMaxRevisionNumber=item.CurrentMaxRevisionNumber;
}
return list.Select(items=>items.OriginalTransaction.ToList();
}
通过使用匿名对象,我们可以在单个数据库访问中获得所需的所有数据,并使用循环填充缺少的属性
由于我们必须修改数据库的自由度和应用程序的有限性,这个解决方案被证明是入侵性最小、性能更高的 我认为你的模型太混乱了。你应该完全放弃这一点,从不同的角度重新审视整件事。