【发布时间】:2018-02-03 23:40:45
【问题描述】:
技术:
- EF Core 2.0.0
- Asp.Net Core Mvc 2.0.0
当我执行此方法时,它会在评估 CurrentGrade 时抛出 “InvalidOperationException:序列不包含匹配元素”。为什么会抛出,我该如何解决?
我有一种搜索方法可以过滤大型数据集(10 000 个用户和数千个相关实体)上的大量属性。我正在尝试优化查询,并且在完成所有过滤之前我不想执行查询。在使用 ToList() 使该方法起作用时,我宁愿针对 IQueryable 工作并在完成过滤后执行查询。
我很确定这在将 EF Core 从 1.x 更新到 2.0 之前有效。
public MemberQueryResult Search(MemberQuery filter)
{
var query = Context.Users
.Include(x => x.Honours)
.Include(x => x.Grades)
.Include(x => x.Strokes)
.Include(x => x.Posts)
.Include(x => x.Loge)
.AsNoTracking();
query = query.ApplyFiltering(filter);
return result;
}
ApplyFiltering() 可以很好地过滤外键,但是当使用 .Where() 过滤导航属性集合时,它会在过滤之前抛出 ICollection Grades on Member。
这是 ApplyFiltering() 中抛出的方法:
private static IQueryable<Member> SearchByCurrentGradeRange(MemberQuery filter, IQueryable<Member> result)
{
if (filter.GradeRange == null) return result;
var gradeRange = filter.GradeRange.Split(',');
var gradeFrom = (Grade)int.Parse(gradeRange[0]);
var gradeTo = (Grade)int.Parse(gradeRange[1]);
result = result.Where(x => x.CurrentGrade >= gradeFrom && x.CurrentGrade <= gradeTo);
return result;
}
CurrentGrade 是成员的计算属性,Grade 只是一个枚举。:
public sealed class Member : IdentityUser
{
public Grade CurrentGrade => Grades.OrderBy(x => x.Grade).Last(x => x.ReceivedDate != null).Grade;
public ICollection<MemberGrade> Grades { get; set; } = new Collection<MemberGrade>();
}
【问题讨论】:
-
尝试将 Include(x => x.CurrentGrade) 添加到您的搜索查询对象。
-
@LazyCoder 我得到一个例外:
An unhandled exception occurred while processing the request. InvalidOperationException: The property 'CurrentGrade' is not a navigation property of entity type 'Member'. The 'Include(string)' method can only be used with a '.' separated list of navigation property names. -
是的,我现在看到了,所以不是这样。但我认为因为你正在做 .AsNoTracking() 然后在以后的生活中尝试 .Where() 它,所以它不喜欢这样......也许尝试放弃它,不要 .ToList() 就让它保持原样是。
-
@Lindeberg 在迁移到 EF Core 2.0 之前,我没有这样做。你确定你有 CurrentGrade 作为过滤器并且没有发生异常吗?
-
@LazyCoder 不使用 AsNoTracking() 只使用 AsQueryable() 没有区别。
标签: asp.net-mvc entity-framework entity-framework-core