如何在Entity Framework中执行条件包含

5
我目前正在使用EF,有两个表EmployeesOrders,考虑到一个Employee有多个Orders
我需要在EF中执行一个查询,以获取所有Employees及其相关的Orders列表,但仅限于两个日期之间。如果一个Employee在给定期间内没有执行任何Order,则他的Orders列表将为空。
我认为需要从EmployeesDbSet开始我的查询,但如何给Orders属性分配条件呢?
我尝试过这样做,但显然不起作用。
public List<Employee> GetAllByIdListAndDateRange(int[] ids, DateTime fromDate, DateTime toDate)
    {
        var query = _context.Set<Employee>().Where(a => ids.Contains(a.EmployeeID)).Include(a => a.Orders.Where(o.OrderDate <= toDate && o.OrderDate >= fromDate));

        return query.ToList();
    }

需要帮忙吗?我猜可能是我错过了一些非常简单的东西。


可能是Entity Framework .Where nested in .Include的重复问题。 - DavidG
1
使用左外连接。请参考此链接:https://dev59.com/YHA75IYBdhLWcg3wPmZ8 - Arash
2个回答

2

您不能在Include中使用Where谓词,但是如果您从订单开始查询,可以简化查询。

如果您再次考虑一下,您需要查询的是订单而不是员工。

var query = _context.Set<Orders>()
                    .Where(o => o.OrderDate <= toDate &&
                                o.OrderDate >= fromDate && 
                                ids.Contains(o.EmployeeID))
                    .Include(e => e.Employee));

1
这几乎解决了我的问题,但我打算遍历“Employee” DbSet。使用您的答案,我将无法检索没有订单的员工。感谢您的帮助 :) - Lucas Ribeiro

1
尝试替换


myQuery.Include(x=>x.Y).Load();

由:

myQuery.Load();
myQuery.SelectMany(x=>x.y).Where( ....).Load();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接