Linq PredicateBuilder не возвращает результаты - PullRequest
0 голосов
/ 27 мая 2011

Я все еще нахожусь на Linq, но, надеюсь, кто-то может помочь мне определить, почему я не получаю никаких результатов от следующего метода, который использует PredicateBuilder (gOrderCount всегда == 0), любая помощь очень ценится:

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

Ответы [ 2 ]

3 голосов
/ 27 мая 2011

Я подозреваю, что это проблема:

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 голосов
/ 28 мая 2011

Я бы немного сломал это, прежде чем пытаться сделать все сразу.Попробуйте сначала, прежде чем создавать 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;
}

Затем вы можете проверить результаты запроса и настроить предикаты, чтобы убедиться, что они верны.

...