【问题标题】:ODATA Date Filter - Generating sql server query differently than expected - causing poor performanceODATA 日期过滤器 - 生成与预期不同的 sql server 查询 - 导致性能不佳
【发布时间】: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


【解决方案1】:

这不是解决您的问题,而是指导您做什么。不是 EF Core 的问题,而是 OData 库本身的问题。

我分析了Microsoft.AspNetCore.OData源代码,发现了这个

https://github.com/OData/WebApi/blob/955ee08511485f9b5ca46a4c9d6736a7e0357e85/src/Microsoft.AspNet.OData.Shared/Query/Expressions/ExpressionBinderBase.cs#L835-L851

所以 OData 生成了这个无效的查询,快速查看代码表明没有办法配置它。

可能你必须在他们的 Github 页面上创建问题。

【讨论】:

  • 谢谢 Svyatoslav Danyliv... 只是想在有日期过滤器时考虑一些解决方法。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2012-10-03
  • 2015-12-16
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多