gpt4 book ai didi

c# - EF6 中的方法链接不输出正确的 SQL

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:23 26 4
gpt4 key购买 nike

我有以下方法:

        private IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLS() {
IQueryable<int> talismanIdCollection = this._cc.TLSTransactionView.Select(x => x.kSECSYSTrans);
return this._cc.CTNTransactionView
.Where(x => !talismanIdCollection.Contains(x.kSECSYSTrans));
}

public IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLSPast24Hours() {
DateTime previousDate = DateTime.Now.Date.AddDays(-1.0);
return this.RetrieveCTNTransactionsNotInTLS()
.Where(x => x.dSECSYSTimeStamp >= previousDate);
}


public IEnumerable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo() {
DateTime previousDate = DateTime.Now.Date.AddDays(-1.0);
IQueryable<int> talismanIdCollection = this._cc.TLSTransactionView
.Select(x => x.kSECSYSTrans);
return this._cc.CTNTransactionView
.Where(x => !talismanIdCollection.Contains(x.kSECSYSTrans))
.Where(x=> x.dSECSYSTimeStamp >= previousDate);
}

由于某种原因,Entity Framework 6 生成的 SQL 输出与结果不匹配。

RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo() 方法将正确提供具有以下内容的 SQL 输出语句:

select ...... from ... where ...     AND ([Extent1].[dSECSYSTimeStamp] >= @p__linq__0)}

当我查看 SQL 语句输出时,另一个没有 dSECSYSTimeStamp 的过滤器。

我比较的方法是 RetrieveCTNTransactionsNotInTLSPast24Hours() 和 RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo()。

我比较了使用 VS 的 SQL 以及将 Debug.Writeline() 附加到上下文中的 Database.Log。

从调试和查看 SQL 输出来看,一个似乎包含日期过滤器,而另一个不包含,但它们都提供了正确的结果。

我尝试使用以下命令查看 SQL(通过断点和查看输出):

        System.Diagnostics.Debug.WriteLine("Running first method");
var result = this.repo.RetrieveCTNTransactionsNotInTLSPast24Hours();
var count = result.Count();
System.Diagnostics.Debug.WriteLine("Running Second method");
var resultTwo = this.repo.RetrieveCTNTransactionsNotInTLSPast24HoursVersionTwo();
var count2 = resultTwo.Count();

我正在使用 EF 6.0。

注意:结果是一样的,因为两者做的事情完全一样,输出的结果也一样。但是,我很好奇并且想了解为什么生成的 SQL 不一样?

最佳答案

问题是您要从您的方法返回一个 IEnumerable。如果这样做,您将强制 SQL 运行查询(未过滤),然后使用 C# 运行第二个查询。更改您的内部查询以返回 IQueryable。这将允许将未执行的表达式树传递到第二个查询中,然后在您运行它时对其进行评估。

private IQueryable<CTNTransactionsView> RetrieveCTNTransactionsNotInTLS()

然后您应该得到相同的 SQL。

关于c# - EF6 中的方法链接不输出正确的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com