为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
叮当猫咪 2022-12-24 15:04:42
我有以下扩展方法来计算产品的平均评分。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.IEnumerable1 [System.Object]'的表达式”。我们可以在 EF Where 中使用扩展方法吗?请就此给我建议。
查看完整描述

2 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

首先很抱歉来晚了...

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

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

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

  2. 只需使用 sql 为您提供的平均方法


查看完整回答
反对 回复 2022-12-24
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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:我没有检查上面的代码


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 259 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号