【问题标题】:Linq query syntax with PredicateBuilder?使用 PredicateBuilder 的 Linq 查询语法?
【发布时间】:2014-10-23 01:50:03
【问题描述】:

是否可以将 PredicateBuilder 与 LINQ 查询语法一起使用?例如,构建具有许多可选参数的基本搜索方法。如何根据已构建的谓词添加 where 子句?

public List<Entities.ProjectSearchResult> GetProjects(string projectName, 
                                                  string projectLaunchName, 
                                                  int? projectID, int? categoryID,
                                                  int? subCategoryID)
{
    var predicate = PredicateBuilder.True<Entities.Project>();
    if (!String.IsNullOrWhiteSpace(projectName))
        predicate = predicate.And(p => p.ProjectName.Contains(projectName));
    if (!String.IsNullOrWhiteSpace(projectLaunchName))
        predicate = predicate.And(p => p.ProjectName.Contains(projectLaunchName));
    if (projectID.HasValue)
        predicate = predicate.And(p => p.ProjectId == projectID.Value);
    if (categoryID.HasValue)
        predicate = predicate.And(p => p.SectorCode == categoryID.Value);
    if (subCategoryID.HasValue)
        predicate = predicate.And(p => p.SubSectorCode == subCategoryID.Value);

    using (CHIPSDbContext db = new CHIPSDbContext())
    {
        var query = (from p in db.Projects
                     join s in db.ProjectStatus on p.ProjectStatusCode equals s.ProjectStatusCode
                     join b in db.ProjectBrands on p.ProjectId equals b.ProjectId into brandList
                     from sublist in brandList.DefaultIfEmpty()
            select new Entities.ProjectSearchResult
            {
                ProjectID = p.ProjectId,
                ProjectName = p.ProjectName,
                ProjectLaunchName = p.ProjectLaunchName,
                Status = s.ProjectStatusDesc,

            }).AsExpandable().ToList();
        return query;
     }
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    在您返回的类型上构建谓词,以便从调用方法中更清楚您过滤的内容。

    var predicate = PredicateBuilder.True<Entities.ProjectSearchResult>(); // Expression with your type
    if (!String.IsNullOrWhiteSpace(projectName))
        predicate = predicate.And(p => p.ProjectName.Contains(projectName));    
    ...
    using (CHIPSDbContext db = new CHIPSDbContext())
    {
        var query = (from p in db.Projects
                     join s in db.ProjectStatus on p.ProjectStatusCode equals s.ProjectStatusCode
                     join b in db.ProjectBrands on p.ProjectId equals b.ProjectId into brandList
                     from sublist in brandList.DefaultIfEmpty()
            select new Entities.ProjectSearchResult
            {
                ProjectID = p.ProjectId,
                ProjectName = p.ProjectName,
                ProjectLaunchName = p.ProjectLaunchName,
                Status = s.ProjectStatusDesc,
    
            })
             .Where(predicate.Expand()) // Don't forget to expand predicate
             .AsExpandable()
             .ToList();
        return query;
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      相关资源
      最近更新 更多