1

这是我使用的通用存储库,正如标题所述,我想知道如何过滤导航属性。

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");

现在我的问题是我想使用存储库向 [Subjects] 和 [Instructors] 添加 .Where(e => !e.IsDeleted) 。

谢谢

编辑:根据 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 的记录。当然我发布的代码作为替代工作,我只是不想提取我不需要的数据,即使我可以使用上面的代码过滤它

4

1 回答 1

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投票-扩展方法

目前,您最好的选择是在 Select 子句中投影您的过滤器,但是使用通用存储库会变得很棘手。

于 2013-04-03T14:37:15.570 回答