为什么具有日期时间属性的 Linq.Dynamic.Core 查询被转换为 TO_TIMESTAMP

Luk*_*mon 3 c# linq oracle entity-framework dynamic-linq

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

知道为什么动态查询像

EntitySet.Where($"Date == @0", date)
Run Code Online (Sandbox Code Playgroud)

被翻译成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")
Run Code Online (Sandbox Code Playgroud)

注意TO_TIMESTAMP函数调用。

而在相同上下文和相同集合上进行标准 Linq 查询

EntitySet.Where(p => p.Date == date)
Run Code Online (Sandbox Code Playgroud)

翻译为:

SELECT * FROM "Schema"."Entities" "Extent1" 
WHERE ("Extent1"."Date" = :p__linq__0)
Run Code Online (Sandbox Code Playgroud)

TO_TIMESTAMP函数调用

Iva*_*oev 5

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

EntitySet.Where(p => p.Date == new DateTime(2016, 02, 12))
Run Code Online (Sandbox Code Playgroud)

其转换方式与示例动态查询相同。

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

EntitySet.Where($"Date == @0.date", new { date })
Run Code Online (Sandbox Code Playgroud)

其翻译方式与示例静态查询相同。