为什么Linq.Dynamic.Core查询与datetime属性被转换为TO_TIMESTAMP

时间:2017-08-09 12:44:55

标签: c# oracle entity-framework linq dynamic-linq

我使用System.Linq.Dynamic.Core版本1.0.7.6与EF和Oracle.ManagedDataAccess.EntityFramework 12.1.2400。

任何想法为什么像

这样的动态查询
EntitySet.Where($"Date == @0", date)

被翻译为sql:

SELECT * FROM "Schema"."Entities" "Extent1"
WHERE (TO_TIMESTAMP('2016-02-12 00:00:00.000', 'YYYY-MM-DD HH24:MI:SS.FF') = "Extent1"."Date")

注意TO_TIMESTAMP函数调用。

虽然标准Linq查询在相同的上下文和相同的集合

EntitySet.Where(p => p.Date == date)

被翻译为:

SELECT * FROM "Schema"."Entities" "Extent1" 
WHERE ("Extent1"."Date" = :p__linq__0)

没有TO_TIMESTAMP函数调用

1 个答案:

答案 0 :(得分:1)

不同之处在于您使用它的方式,Dynamic LINQ通过值绑定传递的变量,这相当于在静态查询中使用常量值。等效的静态LINQ将是

EntitySet.Where(p => p.Date == new DateTime(2016, 02, 12))

将以与示例动态查询相同的方式进行翻译。

如果您希望让Dynamic LINQ将变量作为参数绑定到生成的查询中,您可以使用具有以下属性的匿名类型:

EntitySet.Where($"Date == @0.date", new { date })

将以与示例静态查询相同的方式进行翻译。