我在处理特定的ef查询时遇到了一些麻烦。我尽可能地简化了一切。我只是在查询两列。这是我的模特。
[Table("TAXROLL", Schema = "CLAND")]
public class TaxRoll
{
[Key]
[Column("TAXROLL_ID")]
public string Id { get; set; }
[Column("APN")]
public string APN { get; set; }
}
当我在控制器中执行查询时,如果我执行firstordefault,结果需要15-18秒才能返回。如果我在哪里查询,结果几乎是瞬间的(小于1秒),(参见下面我评论的时序陈述。当我说15-18秒并且几乎是瞬间时,那就是我的数字来自的地方)。
[ResponseType(typeof(TaxRoll))]
public async Task<IHttpActionResult> Get(string id)
{
//var start = DateTime.Now;
//Debug.WriteLine("Starting Query");
var apnRecord = await ctx.TaxRoll.FirstOrDefaultAsync(x => x.APN == id);
//Debug.WriteLine("Returning APN after " + DateTime.Now.Subtract(start).TotalSeconds);
return Ok(apnRecord);
}
当我查询主键(Id)时,无论我如何运行查询,结果每次都会一直快速返回。当我查询APN时,这只是一个问题。是的,APN已编入索引。它也是独一无二的。我可以用它作为PK,事实上我试过了。没有骰子。我知道当我直接对数据库执行时,执行基于APN搜索的查询会一直快速返回。
非常感谢任何帮助或方向 - 我很困惑。
答案 0 :(得分:2)
您的APN列是NULLABLE,使EF添加OR运算符,99%它使SQL“寻找”列(不使用索引)。使APN列NOT NULL。
答案 1 :(得分:2)
除了用户 skalinkin answer之外,您还可以将DbContextConfiguration.UseDatabaseNullSemantics属性设置为true
。
public class YourDbContext : DbContext
{
public YourDbContext()
{
Configuration.UseDatabaseNullSemantics = true;
// ...
}
}
答案 2 :(得分:0)
需要15-18s的查询
var apnRecord = await ctx.TaxRoll.FirstOrDefaultAsync(x => x.APN == id);
与
相同var apnRecord = await ctx.TaxRoll.Where(x => x.APN == id).FirstOrDefaultAsync();
如果您只使用Where(),则不会从数据库中实现任何内容。
另请考虑使用秒表而不是计算时间戳。
var sw = new Stopwatch();
sw.Start();
// do something
Debug.WriteLine(sw.Elapsed);