【问题标题】:LINQ to SQL - OR/AND multiple valuesLINQ to SQL - OR/AND 多个值
【发布时间】:2014-07-31 15:00:26
【问题描述】:

我有以下场景:

一个搜索框可以根据我的一张表中的 3 个不同条件进行搜索 (OR) Contiditon 1) Name + MiddleName + LastName (这三个都是不同的表列) Contiditon 2) LegalName (另一栏) Contiditon 3) 文档(另一栏)

我正在尝试使用 LINQ 创建一个查询,该查询可以获取单独搜索每个字段的结果,但是我在多个搜索词场景中遇到了问题。

说有人搜索“foo bar”。我希望查询返回条件 1、2 或 3 中包含 foo AND bar(以任何顺序)的任何人 如果第一个条件不是连接 3 个单独的字段,我认为这会很容易,但事实并非如此。

到目前为止我有这个:

var searchTerms = "foo bar";
foreach (var splitValue in searchTerms.Split(' '))
{
    var val = splitValue;
    query =
        query.Where(
            p =>
                   (p.Name + (p.MiddleName != null ? " " + p.MiddleName : string.Empty) + 
                   (p.LastName != null ? " " + p.LastName : string.Empty)).Contains(val)
                || (p.LegalName ?? string.Empty).Contains(val)
                || (p.Document ?? string.Empty).Contains(val));
}

这将返回在 3 个条件中的任何一个中包含 foo 和 bar 的结果,但是我想要在至少一个条件中包含 foo 和 bar 的结果。

您认为可以在 LINQ 中编写我想要的查询吗?

【问题讨论】:

  • 不过,您可能需要以扩展方法的形式创建一个有用的工具来执行此操作。
  • @AgentFire 我不认为创建扩展会是一个问题,问题是即使使用单独的方法我也无法提出解决方案。也许有人会想出一些可以引导我更接近解决方案的想法。感谢您的意见。

标签: .net linq linq-to-sql


【解决方案1】:

尝试像这样反转你的循环

    query.Where(p => splitValue.All(val =>  (p.Name + (p.MiddleName != null ? " " + p.MiddleName : string.Empty) + 
               (p.LastName != null ? " " + p.LastName : string.Empty)).Contains(val)
            || (p.LegalName ?? string.Empty).Contains(val)
            || (p.Document ?? string.Empty).Contains(val)));

但不确定性能。作为替代方案,您可以对每个搜索词进行查询,然后取它们的交集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多