Tech:EF Core 2.0 - Filterung IQueryable Navigationseigenschaft Sammlung leer
- EF-Core 2.0.0
- Asp.Net Kern Mvc 2.0.0
Wenn ich diese Methode ausführen es wirft "InvalidOperationException: Sequence enthält kein passendes Element" bei der Bewertung von CurrentGrade. Warum wirft es und wie kann ich es beheben?
Ich habe eine Suchmethode, die auf ziemlich viele Eigenschaften auf einem großen Dataset (10 000 Benutzer mit Tausenden von verbundenen Entitäten) filtert. Ich versuche, die Abfrage zu optimieren, und ich möchte die Abfrage nicht ausführen, bis alle Filterung vorgenommen worden ist. Während die Verwendung von ToList() die Methode funktioniert, würde ich lieber gegen ein IQueryable arbeiten und die Abfrage ausführen, wenn das Filtern durchgeführt wird.
Ich bin mir ziemlich sicher, dass dies funktionierte, bevor EF Core von 1.x auf 2.0 aktualisiert wurde.
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() funktioniert gut für die Filterung auf Fremdschlüssel aber beim Filtern auf einer Navigationseigenschaft Sammlung mit .Where() wirft es auf ICollection Sorten auf Mitglied, wenn kurz vor der Filterung es aufgenommen wurde.
Dies ist die Methode in ApplyFiltering(), die wirft:
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 ist eine berechnete Eigenschaft auf ein Mitglied ist Grade nur eine ENUM .:
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>();
}
versuchen, ein (x => x.CurrentGrade), um Ihr Suchobjekt einschließen hinzufügen. –
@LazyCoder Ich bekomme eine Ausnahme: 'Eine nicht behandelte Ausnahme trat während der Verarbeitung der Anfrage auf. InvalidOperationException: Die Eigenschaft 'CurrentGrade' ist keine Navigationseigenschaft des Entitätstyps 'Member'. Die Methode 'Include (string)' kann nur mit einem '.' getrennte Liste der Navigationseigenschaftsnamen.' – Lindeberg
Ja, ich sehe es jetzt, also das ist es nicht. Aber ich denke, weil Sie tun .AsNoTracking() und dann versuchen, .Wohin() es später im Leben, ist es nicht mögen, dass ... vielleicht versuchen, das fallen zu lassen, nicht .ToList() lassen Sie es so wie es ist. –