使用仅包含where子句的查询忽略对EF的Linq查询,Include()

时间:2014-04-24 02:22:20

标签: c# entity-framework linq-to-entities

我的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;深入挖掘关系层次结构?

3 个答案:

答案 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
                });