过滤实体框架6中包含的元素

时间:2020-05-14 07:51:50

标签: c# .net entity-framework-6

我正在尝试使用Entity Framework 6获取一个Person实体的集合,其中包含一个TimeTrack实体的延迟加载集合。 我只想包含TimeTrack实体,其中Start属性在指定的时间段内。 下面的代码可以满足我的要求,但效果不佳。

    private async Task<List<Person>> GetPersonsWithTimetracksForPeriod(int companyId, DateTime from, DateTime to)
    {
        // Repository.AsQueryable() gets context.AsQueryable() with the wanted type
        var query = Repository.AsQueryable().Where(e => e.CompanyId == companyId).Include(p => p.TimeTracks);
        var persons = await query.ToListAsync();
        // Another way of filtering TimeTracks is needed
        foreach (var person in persons)
        {
            person.TimeTracks = person.TimeTracks.Where(t => t.Start >= from && t.Start <= to).ToList();
        }
        return persons;
    }

有什么方法可以过滤查询中的时间跟踪?

1 个答案:

答案 0 :(得分:1)

您注意到,EF 6不支持在Include方法中进行过滤。

免责声明:我是项目Entity Framework Plus

的所有者

EF + Query IncludeFilter(免费和开源)可轻松过滤包含的实体。

要使用它,只需将所有“包含”替换为“包含过滤器”即可。

示例:

private async Task<List<Person>> GetPersonsWithTimetracksForPeriod(int companyId, DateTime from, DateTime to)
{
    var query = Repository.AsQueryable().Where(e => e.CompanyId == companyId)
                   .IncludeFilter(p => p.TimeTracks.Where(tt => t.Start >= from && t.Start <= to);

    var persons = await query.ToListAsync();

    return persons;
}