2011-05-27 116 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; 
} 

然后你可以检查查询的结果和调整您的谓词,以确保它们是正确的。