【问题标题】:Dynamic number of evaluations on a where (lambda)where (lambda) 上的动态评估次数
【发布时间】:2013-05-27 20:09:58
【问题描述】:

我是 Entity Framework、LINQ 和 lambda 表达式的新手。我需要对用户表进行搜索,并且需要模拟桌面应用程序中已经存在的表。此搜索仅提供 1 个文本字段,然后它会获取您放入其中的任何内容,并针对不同用户的属性(如姓名、姓氏、用户名等)创建一个“包含”查询。最重要的部分是,如果您输入两个或更多词然后搜索使查询搜索不同的词。

例子:

如果我搜索“ju pe”,我会得到“Perez, Juan”,这是通过识别空格来实现的。

使用常规 SQL,我可以构建一个包含查询的常规字符串,但是如何使用 lambda 来做到这一点?

换句话说,我怎样才能在.where() 上获得动态数量的“评估”?赞.Where(EV1 || EV2 || EVn)

【问题讨论】:

    标签: linq entity-framework lambda


    【解决方案1】:

    有一个名为 LinqKit 的简洁库,其中包含 predicatebuilder

    示例代码:

    var predicate = PredicateBuilder.True <User> ();
    
    predicate = predicate.Or(x => x.Name.Contains("ju"));
    predicate = predicate.Or(x => x.Name.Contains("pe"));
    // etc ...
    
    Users.AsExpandable().Where(predicate);
    

    您可以和/或随心所欲。

    【讨论】:

    • 很好,刚刚遇到一个新问题,我正在使用连接: var resultado = db_hms.Users .Join(db_hms.v_natural_person_short, ur => ur.id_employee, np => np.id_natural_person, ( ur, np) => new { Users = ur, Natural_Person = np }) .Where(r => r.Users.id_user.Contains(search) || r.Natural_Person.name_full.Contains(search)) .Select(s => 新 { user_id = s.Users.id_user, nombre = s.Natural_Person.name_full }) .ToList();
    • 到底是什么问题?
    • PredicateBuilder 需要一个类型示例:var predicate = PredicateBuilder.True (),我有一个匿名类型
    • 您可以定义新类型并使用它来代替匿名类型。恐怕这是唯一的选择
    • 处理它,删除连接(创建视图),谓词构建器和空值问题,搜索......
    【解决方案2】:

    如果我理解正确的话,您可以使用简单的 Linq 通过构建复杂的 Where 谓词来做到这一点。如果我误解了你,请告诉我!假设您有一个字符串searchTermInputusers,对于某些类型User 具有Name 字符串属性的IEnumerable&lt;User&gt;。然后你可以写:

    users.Where(user => searchTermInput.Split(' ')
                        .All(searchTerm => user.Name.Contains(searchTerm)));
    

    换句话说:对于每个用户,检查该用户的名称是否包含每个搜索词,如果不包含则将其过滤掉。

    【讨论】:

    • 这是否符合 EF 表达式?
    • 否 - LINQ to Entities 无法识别方法拆分。问题是关于 EF。
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2017-10-14
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多