使用odp.net的Oracle实体框架不在linq查询中获取参数

Jon*_*nna 8 linq entity-framework odp.net

我使用odp.net在Oracle中使用EntityFramework.参数化的sql查询不起作用.

var orderCode = "XYZ";
var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = '{0}'"
    , orderCode
);
Run Code Online (Sandbox Code Playgroud)

(要么)

var set1 = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = ':param'", 
    new OracleParameter("param", orderCode)
);

Console.WriteLine(set.Count() + ", " + set1.Count()); //Gives 0, 0
Run Code Online (Sandbox Code Playgroud)

但是,如果我有硬编码值,它就可以了.

var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = 'XYZ'",
    orderCode
);
Run Code Online (Sandbox Code Playgroud)

有人知道为什么吗?我在该视图中有150列.那是问题吗?

更新: 使用Oracle参数的查询有效.问题是我在:param变量周围有单引号.

话虽如此,带有"{0}"的热门查询不起作用.此外,以下linq查询不起作用.

var set = ctx.Orders.Where(a => a.OrderCode == orderCode); // Gets zero results.
Run Code Online (Sandbox Code Playgroud)

当我对值进行硬编码时,它可以正常工作并获取结果.

var set = ctx.Orders.Where(a => a.OrderCode == "XYZ"); // Gets the results correctly.
Run Code Online (Sandbox Code Playgroud)

更新2: 查询使用Devart的dotconnect驱动程序.看起来这是odp.net的问题.

有人有类似的问题吗?

Tom*_*day 1

不确定您是否截断了示例,但如果您使用多个参数,这可能是问题所在:

Oracle中参数化查询的问题

尽管我看不出您的示例有任何问题,但我想知道您是否遇到了旧的 BindByName 问题。默认情况下,ODP.NET 按照参数添加到集合的顺序将参数绑定到查询,而不是根据您想要的名称。尝试在 OracleCommand 对象上将 BindByName 设置为 true 并查看是否可以解决问题。