这是我使用的通用respoitory,因为标题声明我想知道如何过滤导航属性。
public IEnumerable<T> Query(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "")
{
IQueryable<T> query = _objectSet.Where(e => !e.IsDeleted);
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
控制器:
var viewModel = new StudentViewModel();
viewModel.Students= _unitOfWork.Students.Query(
includeProperties: "Subjects, Instructors");
现在我的问题是我要添加.Where(e =&gt;!e.IsDeleted) 使用存储库到[Subjects]和[Instructors]。
由于
编辑: 根据Ladislav的说法,目前这是不可能的(这里也提到msdn:http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx)
Can i just use this instead?
viewModel.Subjects = viewModel.Students.Where(i => i.StudentID ==Id.Value)
.Single().Subjects.Where(e => !e.IsDeleted);
我唯一担心的是查询可能会返回大量带有isDeleted == true的记录。当然我发布的代码作为替代工作,我只是不想拉取我不需要的数据,即使我可以使用上面的代码过滤它
答案 0 :(得分:2)
LINQ to SQL使用LoadWith DataLoadOption支持此场景。 http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx的示例显示了EF支持Include语句的简单情况。
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Customer>(c => c.Orders);
db.LoadOptions = dlo;
但是,与EF不同,LINQ to SQL也支持以下内容:
dlo.LoadWith<Customer>(c => c.Orders.Where(o => o.ShippedDate is Null);
如果您认为这是EF的重要增强方案,请考虑在http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1015345-allow-filtering-for-include-extension-method投票。
目前,您最好的选择是在Select子句中投射过滤器,但使用通用存储库会变得棘手。