【发布时间】:2019-12-19 04:13:11
【问题描述】:
这是我的查询,执行大约需要 15 秒。该表在REQID上有一个索引
var tls = (from tradelines in _context.TRADELINEs
where tradelines.REQID == requestId
select tradelines).ToList();
型号:
[StringLength(36)]
[Column(TypeName = "char")]
public string REQID { get; set; }
REQID 的 Oracle Db 类型为 CHAR(36 BYTE)
如果我使用硬编码字符串执行相同的查询,它会在大约 1 秒内返回数据。
var tls = (from tradelines in _context.TRADELINEs
where tradelines.REQID == "2435d403-0beb-416f-a536-0df4e2fcc03f"
select tradelines).ToList();
我已经尝试过这种方法:
EntityFunctions.AsNonUnicode(requestId)
仍然没有运气。知道我在这里缺少什么吗?
这样做:
[StringLength(36)]
[Column(TypeName = "varchar")]
public string REQID { get; set; }
抛出一个错误说
在 OracleEFProvider 中找不到存储类型“varchar” 提供者清单
另外,如果我添加,执行时间没有变化
[Column(TypeName = "varchar2")]
EF 日志查询:
SELECT
// Column List
FROM "TRADELINE" "Extent1"
WHERE (("Extent1"."REQID" = :p__linq__0) OR (("Extent1"."REQID" IS NULL) AND (:p__linq__0 IS NULL)))
-- p__linq__0: '2435d403-0beb-416f-a536-0df4e2fcc03f' (Type = Object)
我想知道为什么它会为string 参数生成(Type = Object)?
现在,这很有趣:
同一张表中还有一列,结构如下,
[StringLength(36)]
[Column(TypeName = "char")]
public string ID { get; set; }
此列具有数据类型为CHAR(36 BYTE) 的主键。如果我在此列上应用 where 条件并指定参数值,则只需几毫秒即可执行。 ID 和 REQID 之间的唯一区别是 REQID 允许为空。
【问题讨论】:
-
试试
[Column(TypeName="varchar")] -
追踪 EF 流量,或查看 Oracle 查询计划。通常发生这种情况是因为参数和表之间的数据类型不匹配导致表端转换。在 LINQ 中使用字符串文字时,EF 不会生成参数。正如@Train 建议的那样,尝试
varchar或varchar2作为ColumnAttribute。 -
如果我这样做
varchar它会给我一个例外,varchar2根本不会提高性能。 -
你试过设置
UseDatabaseNullSemantics吗?看到这个帖子:stackoverflow.com/questions/38433594/… -
@Collen:成功了!请将其发布为答案。
标签: c# oracle entity-framework