Oracle 登录/完整表扫描时SQL效率低下(UserStore.FindByNameAsync)

Oracle 登录/完整表扫描时SQL效率低下(UserStore.FindByNameAsync),oracle,entity-framework,entity-framework-6,asp.net-identity,Oracle,Entity Framework,Entity Framework 6,Asp.net Identity,我们在Oracle数据库上使用Asp.Net Identity 2.2.1版和EF 6.1.3版 我们确实在上面的usertable(USERNAME)上有一个索引,但是对于每个用户登录,我们仍然在用户表上获得完整的表扫描 问题似乎是由UserStore中的以下代码引起的: public virtual Task<TUser> FindByNameAsync(string userName) { this.ThrowIfDisposed(); return this.GetU

我们在Oracle数据库上使用Asp.Net Identity 2.2.1版和EF 6.1.3版

我们确实在上面的usertable(USERNAME)上有一个索引,但是对于每个用户登录,我们仍然在用户表上获得完整的表扫描

问题似乎是由UserStore中的以下代码引起的:

public virtual Task<TUser> FindByNameAsync(string userName)
{
  this.ThrowIfDisposed();
  return this.GetUserAggregateAsync((
    Expression<Func<TUser, bool>>) (u =>
    u.UserName.ToUpper() == userName.ToUpper()));
}
这一部分似乎让优化器选择一个完整的表扫描

使用SQL Server时,可以通过将where语句更改为:

public virtual Task<TUser> FindByNameAsync(string userName)
{
  this.ThrowIfDisposed();
  var uName = userName.ToUpper();
  return this.GetUserAggregateAsync((
    Expression<Func<TUser, bool>>) (u =>
    u.UserName.ToUpper() == uName));
}
公共虚拟任务FindByNameAsync(字符串用户名)
{
这个.ThrowIfDisposed();
var uName=userName.ToUpper();
返回此文件。GetUserAggregateAsync((
表达式(u=>
u、 UserName.ToUpper()==uName));
}
现在的位置是:

WHERE N'<USERNAME>' = (UPPER([Extent1].[USERNAME]))
其中N'=(上限([Extent1].[USERNAME]))
但我不知道在使用Oracle时如何对此进行优化。我尝试了Oracle.Managed驱动程序和Devart.Oracle驱动程序,它们都在字段上使用上限函数时生成where语句

数据库中必须有不区分大小写的用户名

那么,当我们使用UPPER(field)=something时,为什么EF会生成一个带有OR语句的SQL呢

还有别的办法吗?有人有好的解决办法吗

在这一点上,我们的最后一个选择可能是在数据表中使用大写用户名,从而避免使用UPPER函数——但这似乎不是最佳解决方案

你试过设置吗

context.UseDatabaseNullSemantics = true;

你试过了吗-看看我的答案没有<代码>上部正在强制表格扫描。在列周围放置一个函数将使其不可搜索(查找)@Nick.McDermaid,查找基于函数的索引。如果OP在“upper(…)”上有一个索引,正如OP所说的,那么它就是sargable.True-我没有注意到part.ErikEJ是正确的。此设置使EF可以按照我的要求创建SQL。谢谢
context.UseDatabaseNullSemantics = true;