我的BLL中有以下代码,可通过WCF服务调用访问:
public List<Dispatch> GetDispatchesByDateRange(DateTime start, DateTime end, params string[] includes)
{
MyEntities entities = new MyEntities();
var res = from d in entities.Dispatches
where d.Route.Legs.Any(x =>
x.StartPoint.ArrivalTime >= start && x.StartPoint.ArrivalTime <= end ||
x.StartPoint.DepartureTime >= start && x.StartPoint.DepartureTime <= end ||
x.EndPoint.ArrivalTime >= start && x.EndPoint.ArrivalTime <= end ||
x.EndPoint.DepartureTime >= start && x.EndPoint.DepartureTime <= end)
select d;
ObjectQuery<Dispatch> query = res as ObjectQuery<Dispatch>;
foreach (string s in includes)
query.Include(s);
return query.ToList();
}
来自客户端的一个呼叫向急切负载相关实体发送一些包含。我遇到的问题是包含被忽略。我已经读过,EF会在子查询中使用或作为投影的一部分时忽略包含。在这种情况下,我没有做任何一种,只是根据where条件选择整个实体,然后附加包含。如果我不使用where where条件,那么包含就好了。有没有其他人遇到这种情况,只是添加一个where条件导致包括被忽略?可能是因为我的&#39;在哪里&#39;深入挖掘关系层次结构?
答案 0 :(得分:3)
您可以尝试在Where()之前调用Include扩展方法。
在EF 5中,它可以作为
完成DbQuery<Dispatch> query = entities.Dispatches;
foreach (var include in includes)
{
query = query.Include(include);
}
var res = from d in dispatches
where ...
select d;
答案 1 :(得分:2)
最后得到了这个工作,不得不使用这个公式:
ObjectQuery<Dispatch> query = (from item in entities.Dispatches select item) as ObjectQuery<Dispatch>;
foreach (string s in includes)
query = query.Include(s);
var res = from d in query
where d.Route.Legs.Any(x =>
x.StartPoint.ArrivalTime >= start && x.StartPoint.ArrivalTime <= end ||
x.StartPoint.DepartureTime >= start && x.StartPoint.DepartureTime <= end ||
x.EndPoint.ArrivalTime >= start && x.EndPoint.ArrivalTime <= end ||
x.EndPoint.DepartureTime >= start && x.EndPoint.DepartureTime <= end)
select d;
基本上,主要区别在于我正在进行初始linq查询,然后附加包含,最后从where组中重新选择where条件。
答案 2 :(得分:0)
我遇到了同样的问题,EF毫无理由地忽略了Include()
。我通过使用子查询来解决它。不是最好的解决方案,但无法找到另一个工作的解决方案......下面的代码段。编辑:您也可以通过连接替换它,没有时间对其进行测试。
注意:我在撰写本文时使用的是EF Core RC1(不是我的决定)。
var result = projs.Select(p => new FoundProject
{
ProjectId = p.Id,
ProjectName = p.Name,
ProjectEntityTypeId = p.ProjectEntityTypeId,
ProjectEntityType = context.ProjectEntityTypes.Where(e => e.Id == p.ProjectEntityTypeId).Select(e => e.Name).FirstOrDefault(),
RentStatus = p.RentStatus,
RentPrice = p.RentPrice
});