Tôi muốn tìm cách sử dụng LINQ để lọc thuộc tính điều hướng đến tập hợp con các thực thể liên quan. Tôi biết tất cả câu trả lời xung quanh vấn đề này đề nghị làm một selector vô danh như:EntityFramework 5 lọc thuộc tính điều hướng bao gồm
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);
Tuy nhiên, đây là ít hơn lý tưởng đáng kể do tính chất chung của thế hệ truy vấn của chúng tôi và cũng mang lại các truy vấn sql khủng khiếp đáng kể nếu bạn ném lên Hồ sơ.
Tôi muốn để có thể đạt được một cái gì đó như:
query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()))
.OrderBy(x => x.Discussions.Count())
.ThenBy(x => x.Name);
tôi nhận ra rằng đây không được hỗ trợ trong EF5 (hoặc bất kỳ phiên bản cho rằng vấn đề) nhưng có phải là một cách để thực hiện kìm hãm sự kết quả thiết lập thông qua LINQ mà không delving vào vô danh loại chọn báo cáo.
tôi đã cố gắng làm điều gì đó theo giai điệu của:
query.GroupJoin(discquqery,
x => x.ID,
x => x.Event.ID,
(evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList();
Tuy nhiên bạn không thể có nhiệm vụ bên trong một biểu thức lambda và chọn một loại vô danh ở đây gây ra tình trạng khó xử tương tự mà nó sử dụng lựa chọn.
Tôi đoán Tôi không thể hiểu tại sao EF không cung cấp một chiều (mà tôi có thể tìm thấy) để tạo ra:
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
Nó là như vậy đơn giản để hạn chế tham gia vào SQL phải có một cách để làm thông qua Linq.
PS: Tôi đã tìm kiếm ngăn xếp, MSDN, chuyên gia trao đổi, v.v. Vui lòng nhận ra đây không phải là bản sao. Bất cứ điều gì thậm chí chạm vào chủ đề này hoặc có một cảnh sát "Nó không thể được thực hiện" câu trả lời hoặc không có câu trả lời nào cả. Không có gì là không thể ... kể cả điều này.
Vâng, đây là câu trả lời "có thể thực hiện": http://stackoverflow.com/a/13904825/861716 –
Có nhiều cách để mở rộng công cụ tạo truy vấn trong EF. Vì vậy, nó không phải là không thể, và nếu đó là tuyến đường duy nhất thì câu trả lời là phần mở rộng cho công cụ truy vấn EF để cho phép INNER/OUTER JOIN chứa các bộ lọc bổ sung. NOTHING là không thể ... nếu tôi phải biên dịch lại EF thì tôi sẽ ... Nó không có câu trả lời hiện có nghĩa là câu trả lời tự xây dựng (mà tôi hiện đang và ngay cả khi tôi hỏi câu hỏi, dự định làm) – VulgarBinary
tinh thần !! –