2012-10-21 83 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