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

标签 c# entity-framework visual-studio visual-studio-2015 entity-framework-6

我有以下方法:

        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/

相关文章:

c# - CA1822 : Mark members as static, 当用于不同的程序集时

c# - 如何模拟从泛型参数继承?

c# - 使用与表相同类型的 View

c++ - Visual Studio 如何在内核模式驱动程序项目中使用 C++ 标准库?

c++ - 如何在正则表达式中表示 C++ 函数名?

c# - 从 JSON Api WinRT 反序列化对象

c# - EF Core 3.1 更新实体

c# - 如何给edmx添加功能

entity-framework - Entity Framework 4.3 Code First 无法创建 Datetime2?

visual-studio - Microsoft Visual Studio Community可执行文件位于哪里?