2013-02-06 39 views
15

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.

+1

Vâng, đây là câu trả lời "có thể thực hiện": http://stackoverflow.com/a/13904825/861716 –

+5

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

+4

tinh thần !! –

Trả lời

8

Bất cứ điều gì thậm chí chạm vào chủ đề này hoặc có đồng ý "Không thể hoàn thành " 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ể ... bao gồm cả điều này.

chắc. Điều đó là có thể. Bạn có thể tải mã nguồn EF và tự thêm tính năng này. Nó sẽ là đóng góp lớn cho dự án nguồn mở và cộng đồng. Tôi tin rằng đội ngũ EF sẽ sẵn sàng giúp bạn với nỗ lực của bạn.

Với phiên bản hiện tại "không thể thực hiện" is the answer. Bạn có thể sử dụng phép chiếu để ẩn danh hoặc loại không được ánh xạ đặc biệt như bạn đã mô tả ở đầu câu hỏi của mình. Các tùy chọn khác là truy vấn rõ ràng riêng biệt để tải các thực thể liên quan cho phụ huynh đơn lẻ hoặc truy vấn riêng biệt để tải các thực thể liên quan cho tất cả các bậc cha mẹ.

quan hệ tải cho cha mẹ duy nhất:

context.Entry(event) 
     .Collection(e => e.Discussions) 
     .Query() 
     .Where(d => ...) 
     .Load(); 

quan hệ tải cho tất cả các bậc cha mẹ (yêu cầu tải lười biếng được tắt):

// load all parents 
var events = query.Where(e => ...).ToList(); 

// load child filtered by same condition for parents and new condition for children 
childQuery.Where(d => e.Event ... && d.Something ...).Load(); 

Giải pháp thứ hai đòi hỏi trẻ phải có tài sản chuyển hướng trở lại cha mẹ (để xây dựng cùng một điều kiện truy vấn được sử dụng ban đầu để tải cha mẹ).Nếu bạn có mọi thứ được cấu hình chính xác và các thực thể được đính kèm, EF sẽ tự động sửa các mối quan hệ của bạn (các bộ sưu tập) trong các thực thể cha mẹ (nhưng nó sẽ không đánh dấu bộ sưu tập trong proxy động khi được nạp vì vậy đó là lý do tại sao bạn không thể sử dụng nó cùng với tải lười).

+0

sau đó dường như tôi đang mở rộng lõi EF5. Bạn có biết nếu có một cách để mở rộng thay vì sửa đổi và biên dịch lại toàn bộ DLL? – VulgarBinary

+1

Bạn sẽ phải biên dịch lại DLL. Bạn có thể truy cập [EF codeplex site] (http://entityframework.codeplex.com/discussions) và thảo luận về sự đóng góp này với đội ngũ EF trực tiếp - họ có thể đã có một số thiết kế cấp cao cho tính năng này và chia sẻ nó với bạn. –

+3

Bình chọn cho bộ lọc Bao gồm [ở đây] (https://entityframework.codeplex.com/workitem/47)! – Chris

Các vấn đề liên quan