簡體   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