如何解决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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。