2014-04-24 124 views
0

我有我的BLL下面的代碼,它通過WCF服務調用訪問:Linq查詢,包括()與只包含一個查詢忽略了where子句

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條件導致包括被忽略?難道這是因爲我的'在哪裏'深入到關係層次結構中?

回答

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條件。

+0

這很方便知道,但它是我還是這看起來像EF ??中的錯誤! – Shawson

+0

已將評論移至單獨的答案。 – rumblefx0

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; 
+0

感謝您的迴應! entities.Dispatches是一個對象集,所以我不得不使用ObjectQuery來實現相同的目標,但不幸的是它仍然沒有執行包含。我可以在SQL Profiler中看到查詢,它只是從Dispatches中進行選擇,並且有一個巨大的where exists子句。該死! – Erikest

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