我想找到一種使用Linq過濾導航屬性到相關實體子集的方法。我知道解決這個問題的所有答案,建議做一個匿名的選擇,例如:EntityFramework 5過濾一個包含的導航屬性
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);
然而,這是理想顯著較少,由於我們的查詢生成的一般性質,也產生顯著可怕的SQL查詢,如果你扔了探查。
我希望能夠完成這樣的:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
我知道這是不是在EF5(或與此有關的任何版本)的支持,但必須有完成約束的方式結果集通過Linq而不需要深入研究匿名類型選擇語句。
我試圖做一些的調整:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
但是你不能有一個lambda表達式內部分配和這裏選擇一個匿名類型會導致同樣的困境,它並使用選擇。
我想我無法理解爲什麼EF不提供方式(即我能找到),以產生:
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
它是如此簡單約束在SQL存在的加入是一個辦法做到它也通過Linq。
PS:我已經搜索過堆棧,MSDN,專家交換等請認識到這不是重複的。甚至任何涉及這個問題的東西都有一個「不能做」答案或根本沒有答案。沒有什麼是不可能的......包括這個
那麼,這裏是一個「它可以做到」的答案:http://stackoverflow.com/a/13904825/861716 –
有很多方法可以在EF中擴展查詢生成引擎。所以這不是不可能的,如果這是唯一的路線,那麼答案就是EF查詢引擎的擴展,以允許INNER/OUTER JOIN包含額外的過濾器。沒有什麼是不可能的......如果我必須重新編譯EF,那麼我會......它沒有現有的答案意味着答案是自己構建它(我現在甚至當我問這個問題,計劃在做什麼) – VulgarBinary
這就是精神!! –