EF核心-在Where中使用扩展方法

时间:2019-04-24 06:23:51

标签: c# sql entity-framework .net-core ef-core-2.0

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

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 1 [System.Object]'的表达式”。

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

2 个答案:

答案 0 :(得分:0)

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:我尚未检查以上代码

答案 1 :(得分:0)

首先对参加聚会晚点感到抱歉...

但是就像Gert Arnold所说的那样,这一切都将在内存中完成。 因此,EF会通过产品评论在内存中获取整个产品表,这可能会对性能造成灾难性的影响。

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

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