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

dba5bblo  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(138)

我使用的是System.Linq.Dynamic.Core版本1.0.7.6,带有EF和Oracle.ManagedDataAccess.EntityFramework12.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函数调用

cnjp1d6j

cnjp1d6j1#

区别在于你使用它的方式,动态LINQ绑定传递的变量 * 通过值 *,这相当于在静态查询中使用 * 常量 * 值。等效的静态LINQ是

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

其将以与示例动态查询相同的方式进行转换。
如果你想让Dynamic LINQ将变量作为参数绑定到结果查询,你可以使用匿名类型和如下属性:

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

它将以与示例静态查询相同的方式进行转换。

5gfr0r5j

5gfr0r5j2#

当我在当前版本的System.Linq.Dynamic.Core中遇到同样的问题时,我无意中发现了这个老问题。要在当前版本中修复它,您只需启用UseParameterizedNamesInDynamicQuery配置选项,例如:

var config = new ParsingConfig
{
    UseParameterizedNamesInDynamicQuery = true,
};
query.Where(config, CommandText, ParameterList.ToArray());

相关问题