【发布时间】:2021-03-25 03:24:23
【问题描述】:
当我将日期过滤器传递给 Odata 时,其生成查询如下:导致性能不佳
SELECT TOP(10000) [$it].[ID], Column1, ....
FROM tablename AS [$it]
WHERE (((DATEPART(year, [$it].[COBDate]) * 10000) + (DATEPART(month, [$it].[COBDate]) * 100)) + DATEPART(day, [$it].[COBDate])) = (((2020 * 10000) + (12 * 100)) + 4)
ORDER BY [$it].[ID]
我的问题是:如何生成如下查询以获得更好的性能?
SELECT TOP(10000) [$it].[ID], Column1, ....
FROM tablename AS [$it]
WHERE COBDate = '2020-12-04'
ORDER BY [$it].[ID]
技术细节: [在此处输入图片描述][1] [1]:https://i.stack.imgur.com/t4lbY.png
Odata 请求:
https://localhost:5001/odata/Product?api-version=1.0&%24filter=COBDate%20Eq%202020-12-04
模型类:
public DateTime COBDate { get; set; }
模型配置:
product.Property(x => x.COBDate).AsDate();
控制器:
[Produces("application/json")]
[ProducesResponseType(typeof(ODataValue<IEnumerable<Product>>), Status200OK)]
[ODataRoute("Product")]
[ConfigurableEnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get()
{
try
{
return Ok(context.tablename.AsQueryable());
}
catch (Exception ex)
{
logger.LogError(ex, "Call failed.");
return BadRequest($"{ex}");
}
}
【问题讨论】:
-
EF Core 共有三个版本。哪个失败了?
-
没有失败,后台查询没有按预期生成。无论如何,Microsoft.EntityFrameworkCore (2.2.6)
-
这与EF Core无关,因为谓词是由OData查询处理器生成的。
标签: .net asp.net-core entity-framework-core odata