2012-10-21 95 views
3

我一直在使用軟刪除,現在我想加載我的實體的導航屬性不是「刪除」。我找到了一種方法,這樣我的問題不是爲我清楚,還有另一種方法來做到這一點。正在加載過濾導航屬性

Context.CreateSet().Include("Salary").Select(u => new {User= u, Salary = u.Salarys.Where(s => !s.Deleted)}).AsQueryable().Select(a => a.User).AsQueryable();

+0

這裏有一個工作軟刪除解決方案:http://stackoverflow.com/questions/12698793/soft-delete-entity-framework-code-first/18985828#18985828 – Colin

回答

4

預先加載不支持篩選。您的代碼可以簡化爲:

var users = Context.CreateSet<User>() 
        .Select(u => new { 
         User = u, 
         Salary = u.Salaries.Where(s => !s.Deleted) 
        }) 
        .AsEnumerable() 
        .Select(a => a.User); 
不需要

Include,因爲你是用自己的查詢和AsQueryable更換它不是必要的,因爲該查詢IQueryable所有的時間,直到叫AsEnumerable這將sqitch到LINQ到 - 選擇用戶和選定工資時的對象。 EF將負責爲您正確固定導航屬性。

+0

這是目前的解決方案,謝謝,但EF不支持更清晰的東西,這看起來像個詭計。 – Deumber

+0

是的,因爲過濾導航屬性[不支持](http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-擴展方法)。 –

+0

如果工資是多對多的關係,這個解決方案需要修改嗎?我測試它,並且不會在用戶嘗試過濾具有多對多關係的導航屬性的新用例中工作 – Deumber