【问题标题】:Best practices to implement Advanced search using linq and Entityframework使用 linq 和 Entityframework 实现高级搜索的最佳实践
【发布时间】:2016-07-23 13:33:38
【问题描述】:

我正在尝试使用 LINQ 和实体框架根据 10 个参数在我的应用程序中构建高级搜索,但用户可以发送一个或多个参数进行搜索。我厌倦了像下面这样实现它,但它没有工作,而是创建 if 条件并在每次检查时更改查询。

那么有没有什么简单的方法可以使用LINQ根据用户输入进行选择来匹配结果呢?

var data = (from item in db.Student
           where item.Firstname == fname
           && item.Middlename == mname
           && item.Lastname == lname
           && item.Birthday == birthday
           && item.Age == age
           && item.AdmissionYear == year
           && item.Grade == grade
           && item.Address == Address
           && item.Class == class
           && item.Number == number
           select item).FirstOrDefault();

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    实现这一点的简单方法是使用 where 子句链。我一直更喜欢这种方法而不是表达式树,因为它简单明了。

    假设你所有的谓词值都是可以为空的,下面是一个例子:

    var query = db.Student.AsQueryable();
    
    if (age != null)
        query = query.Where(s => s.Age == age.Value);
    if (fname != null)
        query = query.Where(s => s.Firstname == fname);
    if (lname != null)
        query = query.Where(s => s.Lastname == lname);
    
    // etc...
    
    var student = query.FirstOrDefault();
    

    通过这种方式,您可以仅使用用户传入的属性动态构建 where 子句,而忽略其余部分。

    您还可以在新的 Filter 对象中定义所有参数,并将这些“if”语句提取到他们自己的 FilterStudents 方法中,该方法采用 IQueryableFilter 作为参数。

    【讨论】:

      【解决方案2】:

      您可以使用并构建一个表达式树,它将根据您传递的参数动态构建您的过滤子句

      这里有一个例子的简单文章

      http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

      您也可以使用PredicateBuilder

      http://www.albahari.com/nutshell/predicatebuilder.aspx

      所以你会有这样的东西

      IQueryable<Product> SearchProducts (params string[] keywords)
      {
        var predicate = PredicateBuilder.False<Product>();
      
        foreach (string keyword in keywords)
        {
          string temp = keyword;
          predicate = predicate.Or(p => p.Description.Contains (temp));
        }
        return dataContext.Products.Where (predicate);
      }
      

      【讨论】:

      • 不知道 Albahari 的谓词构建器。感谢您的链接。
      【解决方案3】:

      我不确定“简单”,但是是的,有可能。

      这里的主要思想是为 QueryAble.Where() method 创建一个 expression tree

      public class SearchedTerms
      {
          public string FirstName {get;set;}
          ...
          public int Age {get;set;}
      }
      
      public Expression<Func<Student,bool>> GetPredicateExpression(SearchedTerms terms)
      {
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        相关资源
        最近更新 更多