繁体   English   中英

EF Core - 在 Where 中使用扩展方法

[英]EF Core - Using extension method inside Where

我有以下扩展方法来计算产品的平均评分。

public static class Extensions
{
    public static decimal CalculateAverageRating(this ICollection<ProductReview> productReviews)
    {
        // Calculate and return average rating

        return averageRatings;
    }
}

我想在 EF 可查询中使用此方法,如下所示:

var products = _context.Products
            .Include(pr => pr.ProductReviews)
            .AsQueryable();

        if(searchParams.Rating != 0)
            products = products.Where(p => p.ProductReviews.CalculateAverageRating() == searchParams.Rating);

但是我不断遇到错误“ArgumentException:类型为'System.Collections.Generic.IAsyncEnumerable 1[Products.Reviews.ProductReview]' cannot be used for parameter of type 'System.Collections.Generic.IEnumerable ' 的方法”。

我们可以在 EF Where 中使用扩展方法吗? 请就此给我建议。

EF 中的扩展方法没有问题。 错误是关于错误的数据类型。 所以请尝试这种方式

public static class Extensions
{
    public static decimal CalculateAverageRating(this IAsyncEnumerable<ProductReview> productReviews)
    {
        // Calculate and return average rating

        return averageRatings;
    }
}

var products = _context.Products
            .Include(pr => pr.ProductReviews)
            .AsQueryable().ToAsyncEnumerable();

        if(searchParams.Rating != 0)
            products = products.Where(p => p.ProductReviews.CalculateAverageRating() == searchParams.Rating);

PS:我没有检查上面的代码

首先很抱歉来晚了...

但正如 Gert Arnold 所说,这一切都会在记忆中完成。 因此 EF 将获取内存中包含产品评论的整个产品表,这对性能来说可能是灾难性的。

您可能想要做的是(2 是更好的方法):

  1. 如果您真的想继续使用您的扩展方法,请将产品和产品评论中所需的属性投影到虚拟机中,然后进行过滤。
  2. 只需使用 sql 为您提供的平均方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM