技术:EF核心2.0 - 过滤的IQueryable导航属性集合空
- EF核心2.0.0
- Asp.Net核心的mvc 2.0.0
在i执行此方法它引发“InvalidOperationException:序列在评估CurrentGrade时不包含匹配元素”。它为什么会抛出,我该如何修复它?
我有一个搜索方法过滤了大量数据集上的很多属性(拥有数千个相关实体的10000个用户)。我试图优化查询,并且我不想在所有过滤完成之前执行查询。虽然使用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()可以很好地用于筛选外键,但使用。凡()上的导航属性集合过滤时在刚过滤之前被列入它洒在ICollection的等级会员。
这里面抛出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是一个构件上的计算出的性能,等级仅仅是一个枚举:
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>();
}
尝试添加包含(X => x.CurrentGrade)到您的搜索查询的对象。 –
@LazyCoder我收到一个异常: '处理请求时发生未处理的异常。 InvalidOperationException:属性'CurrentGrade'不是实体类型'Member'的导航属性。 'Include(string)'方法只能与'。'一起使用。导航属性名称的分隔列表。' – Lindeberg
是的,我现在看到它,所以不是这样。但我认为,因为你正在做.AsNoTracking(),然后尝试在以后的时间(),它不喜欢...也许尝试删除它,不要.ToList()只是让它作为它是。 –