Linq PredicateBuilder没有返回结果

问题描述

| 我仍然在努力提高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();
        }
    }
    

解决方法

        我怀疑这是问题所在:
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\"));
    ,        在尝试一次完成所有操作之前,我将对此进行分解。在创建
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;
}
然后,您可以检查查询结果并调整谓词以确保它们正确。