Ef 核心表关系包括计数错误

问题描述

我刚开始使用 .NET 和 EF Core。我无法计算与 post 表关联的 like 表。

我想要做的是在帖子上显示点赞总数。

PostManager

var posts = await _unitOfWork.Posts
                             .GetAllAsync(p => p.UserId == userId && 
                                               p.IsActive == true,l => l.Likes.Count()); 

EfBaseRepository

public async Task<IList<TEntity>> GetAllAsync(Expression<Func<TEntity,bool>> predicate = null,params Expression<Func<TEntity,object>>[] includeProperties)
{
        IQueryable<TEntity> query = _context.Set<TEntity>();

        if (predicate != null)
        {
            query = query.Where(predicate);
        }

        if (includeProperties.Any())
        {
            foreach (var includeProperty in includeProperties)
            {
                query = query.Include(includeProperty);
            }
        }

        return await query.ToListAsync();
}

错误

system.invalidOperationException: 表达式 'Convert(l.Likes.AsQueryable().Count(),Object)' 在 'Include' 操作中无效,因为它不代表属性访问:'t => t 。我的财产'。要定位在派生类型上声明的导航,请使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。可以通过组合 Where、OrderBy(Descending)、ThenBy(Descending)、Skip 或 Take 操作来过滤集合导航访问。有关包含相关数据的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=746393

解决方法

改为这样做。基本上,您要实现“延迟加载”。在您的“GetAllAsync”方法中,“includeProperties”需要一个属性。在这种情况下,“喜欢”属性是“l.Likes”而不是“l.Likes.Count()”。之后你可以数数。

var posts = await _unitOfWork.Posts
                         .GetAllAsync(p => p.UserId == userId && 
                                           p.IsActive == true,l => l.Likes).ToListAsync(); 
var likesCount = posts.Likes.Count();
,

如果您不熟悉 EF Core,请不要创建通用存储库,这是无用的模式,只会增加复杂性。

正确和最快的查询是:

var likesCount = await _context.Posts
   .Where(p => p.UserId == userId && p.IsActive == true)
   .SelectMany(p => p.Likes)
   .CountAsync();