2011-05-27 121 views
0

我還在斜坡上升LINQ的,但我希望有人能幫助我確定爲什麼我沒有收到從使用PredicateBuilder(gOrderCount總是== 0),任何幫助非常下列方法的任何結果讚賞:LINQ的PredicateBuilder沒有返回結果

public IQueryable<TrackingInfo> GetTrackingAllOrders(string custName, string supplier, string assigned) 
    { 
     var predicate = PredicateBuilder.False<TrackingInfo>(); 

     if (custName != null && custName != String.Empty) 
     { 
      predicate = predicate.And(c => c.CustomerName.Contains(custName)); 
     } 
     if (supplier != null && supplier != String.Empty) 
     { 
      predicate = predicate.And(c => c.Supplier.Contains(supplier)); 
     } 
     if (assigned != null && assigned != String.Empty) 
     { 
      predicate = predicate.And(c => c.AssignedTo.Contains(assigned)); 
     } 

     IQueryable<TrackingInfo> oList = null; 

     using (var ctx = new OMS_ISSEntities()) 
     { 
      oList = (from c in ctx.GetSSISTrackingInfoFuction() 
        orderby c.OrderID descending 
        select new TrackingInfo 
        { 
         OrderID = c.OrderID, 
         CustomerName = c.CustomerName ?? String.Empty, 
         ClientServiceID = c.ClientServiceID ?? String.Empty, 
         SiteName = c.SiteName ?? String.Empty, 
         SiteStatus = c.SiteStatus ?? String.Empty, 
         IPNETWCount = c.IPNETWCount ?? 0, 
         VOIPCount = c.VOIPCount ?? 0, 
         AirCardCount = c.AirCardCount ?? 0, 
         TicketProductType = c.TicketProductType ?? String.Empty, 
         SiteAddress = c.SiteAddress ?? String.Empty, 
         LCONPhone = c.LCONPhone ?? String.Empty, 
         Supplier = c.Supplier ?? String.Empty, 
         SupplierOrderNumber = c.SupplierOrderNumber ?? String.Empty, 
         ConfFOCDate = c.ConfFOCDate, 
         DSLNumber = c.DSLNumber ?? String.Empty, 
         DSLLineType = c.DSLLineType ?? String.Empty, 
         JournalNote = c.JournalNote ?? String.Empty, 
         JournalLastUpdate = c.JournalLastUpdate, 
         Project = c.Project ?? String.Empty, 
         SiteICB = c.SiteICB, 
         SiteISSDueDate = c.SiteISSDueDate, 
         SiteISSInfo = c.SiteISSInfo ?? String.Empty, 
         AssignedTo = c.AssignedTo ?? String.Empty, 
         SiteSubmitDate = c.SiteSubmitDate, 
         SiteID = c.SiteID ?? String.Empty, 
         UserLogin = c.UserLogin ?? String.Empty, 
         ClientSiteType = c.ClientSiteType ?? String.Empty, 
         OpenJeop_Supp = c.OpenJeop_Supp, 
         PastDueFOC = c.PastDueFOC, 
         DaysSinceLastJNUpdate = c.DaysSinceLastJNUpdate, 
         SiteStatusID = c.SiteStatusID, 
         AssignedToID = c.AssignedToID, 
         SupplierID = c.SupplierID, 
         MasterCustID = c.MasterCustID, 
         MaxJeopSuppDate = c.MaxJeopSuppDate, 
         EstimatedTTU = c.Sit_EstTTU 
        }).ToList().AsQueryable().Where(predicate); 

      gOrderCount = oList.Count(); 


      if (gOrderCount > 1500) //we limit max number of records returned to 1500 
      { 
       return null; 
      } 

      return oList.AsQueryable(); 
     } 
    } 
+0

感謝這麼多的反饋。通過簡單地改變無功謂詞= PredicateBuilder.False (); var var predicate = PredicateBuilder.True ();這開始工作。我將考慮實施一些其他建議,但再次感謝您的快速反饋。 – 2011-05-31 18:25:38

回答

3

我懷疑這就是問題所在:

var predicate = PredicateBuilder.False<TrackingInfo>(); 

所以,你開始了與謂詞不匹配什麼,然後加入更多的限制,從而有效結束了是這樣的:

var results = entities.Where(c => false && c.CustomerName.Contains("fred")); 

這顯然永遠不會匹配任何內容。

你想用這個來開始:

var predicate = PredicateBuilder.True<TrackingInfo>(); 

讓你的查詢結束,就像這樣:

var results = entities.Where(c => true && c.CustomerName.Contains("fred")); 
+0

我假設你的意思'PredicateBuilder.True ()',對吧? – svick 2011-05-27 20:12:09

+0

@svick:嗯,是的。 Doh doh doh! – 2011-05-27 20:20:13

0

我會努力在做的一切之前有點打破這一旦。試試這個第一次創建TrackingInfo對象之前。

using (var ctx = new OMS_ISSEntities()) 
{ 
    var oList = from c in ctx.GetSSISTrackingInfoFuction().AsExpandable() 
       orderby c.OrderID descending 
       where c.Any(Predicate.Compile()) 
       select c; 
} 

然後你可以檢查查詢的結果和調整您的謂詞,以確保它們是正確的。