Ich möchte einen Weg finden, Linq verwenden, um eine Navigationseigenschaft zu einer Teilmenge von verbundenen Entitäten zu filtern. Ich weiß, dass alle Antworten, um dieses Thema empfehlen, einen anonymen Wähler tun wie:EntityFramework 5 Filter eine eingeschlossene Navigationseigenschaft
query.Where(x => x.Users.Any(y => y.ID == actingUser.ID))
.Select(x => new
{
Event = x,
Discussions = x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())
})
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Event.Name);
Dies ist jedoch deutlich geringer als ideal aufgrund der allgemeinen Natur unserer Abfrage Generation und ergibt auch deutlich schreckliche SQL-Abfragen, wenn Sie erbrechen Profiler.
Ich möchte in der Lage sein, etwas zu erreichen, wie:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
Mir ist klar, dass dies nicht in EF5 (oder einem beliebigen Version für diese Angelegenheit) unterstützt wird, aber es muss ein Weg, um das erreichen Zwang Ergebnis wird über Linq festgelegt, ohne sich in anonyme Select-Anweisungen zu vertiefen.
Ich habe etwas in der Größenordnung versuchter tun:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
jedoch nicht Zuordnung in einem Lambda-Ausdruck haben kann und die Auswahl eines anonymen Typ hier bewirkt, dass das gleiche Dilemma, dass sie die select nicht verwenden.
Ich glaube, ich kann nicht begreifen, warum EF nicht bieten eine Möglichkeit, (dass ich finden kann) zu erzeugen:
SELECT
--Properties
FROM Event e
LEFT OUTER JOIN Discussions d
ON e.ID = d.EventID AND --Additional constraints
WHERE
--Where conditions
ORDER BY
--Order Conditions
Es ist so einfach, die Verbindung in SQL zu beschränken muss es einen Weg, um zu tun, es auch durch Linq.
PS: Ich habe Stack, MSDN, Expertenaustausch usw. gesucht. Bitte beachten Sie, dass dies kein Duplikat ist. Alles, was dieses Thema berührt, hat entweder eine Antwort "Es kann nicht getan werden" oder überhaupt keine Antwort. Nichts ist unmöglich ... einschließlich dies.
Nun, hier ist eine Antwort "es kann getan werden": http://StackOverflow.com/a/13904825/861716 –
Es gibt Möglichkeiten, die Abfragegenerierungsengine in EF zu erweitern. Es ist also nicht unmöglich, und wenn das der einzige Weg ist, dann ist die Antwort die Erweiterung der EF-Abfrage-Engine, damit INNER/OUTER JOIN zusätzliche Filter enthalten kann. NICHTS ist unmöglich ... wenn ich EF neu kompilieren muss, dann werde ich ... Es hat keine existierende Antwort bedeutet, dass die Antwort es selbst erstellt (was ich momentan und sogar wenn ich die Frage stelle, geplant) – VulgarBinary
Das ist das Geist!! –