Es ist eine Struktur:Entity Framework - wo clausule mit Any() und Alle() verwenden
-Client haben mehrere Fälle und Fall haben mehrere Protokolle.
public class Client
{
public int Id { get; set; }
public IEnumerable<Case> Cases { get; set; }
}
public class Case
{
public int CaseId { get; set; }
public IEnumerable<Log> Histories { get; set; }
}
public class Log
{
public int Id { get; set; }
public string Code { get; set; }
}
Ich möchte Kunden abrufen, die alle Protokolle von jeweils Code-Eigenschaft auf ‚FALSCH‘ OR Clients haben, die überhaupt keine Protokolle haben. Außerdem habe ich paar einfache Bedingungen, die Sie unten vereinfacht für die Zwecke des Veröffentlichungscodes sehen können (natürlich EF verwendet IQueryable anstelle von ICollection).
Zuerst habe ich versucht, die Erweiterungsmethode AllOrEmpty zu erstellen, die funktioniert, aber nicht in Linq zu Entitäten (es akzeptiert keine Erweiterungsmethoden).
public static class Extensions
{
public static bool AllOrEmpty<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
return source.All(predicate) || !source.Any();
}
}
var sampleIds = new List<int>() { 1, 2, 3 };
Entities db = new Entities();
db.Clients
.Where(client => client.Cases
.Where(cas => sampleIds.Contains(cas.CaseId))
.SelectMany(cas => cas.Histories
.Where(log => log.Id < 10)
)
.AllOrEmpty(log => log.Code == "WRONG") << ideal solution
)
.Select(client => client.Id);
Zweitens versuche ich Lambda-Ausdruck mit return-Anweisung in dem clausule und es funktioniert gut, aber nicht für IQueryable und gibt Fehler zu erzeugen: Ein Lambda-Ausdruck mit einer Aussage Körper
zu einem Ausdrucksbaum kann nicht konvertiert db.Clients
.Where(client =>
{
var logs = client.Cases
.Where(cas => sampleIds.Contains(cas.CaseId))
.SelectMany(cas => cas.Histories
.Where(log => log.Id < 10)
);
return !logs.Any() || logs.All(log => log.Code == "WRONG");
})
.Select(client => client.Id);
Ich habe keine Ahnung, wie man solche Abfrage erstellen und es einfach halten und etwas schmutzigen Code vermeiden. Irgendeine Idee?
Mögliche Duplikat von [Entity Framework Filter "Ausdruck>"] (http://stackoverflow.com/questions/18337692/entity-framework-filter-expressionfunct-bool) –
Igor