【问题标题】:Join columns in LINQ and run contains operator在 LINQ 中加入列并运行包含运算符
【发布时间】:2012-07-28 04:26:47
【问题描述】:

我正在尝试创建一种搜索方法,我想检查关键字是否包含在给定记录的任意数量的不同列中。

我的Linq语句如下:

string[] searchFilter = {"john", "iceberg"};


var q = from qua in qual
                    join del in deliverables on qua.ID equals del.Q_ID
                    where searchFilter.All(s => (qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower().Contains(s))
                    select qua;

然而,我收到一条错误消息,其中指出:“本地序列不能用于查询运算符的 LINQ to SQL 实现中,但 Contains() 运算符除外。”

【问题讨论】:

  • 那么,问题是什么?例外是不言自明的——您有一个本地序列(读取:内存中),并且您不能在带有 L2S 的 linq-query 中使用它,除非您将它与 Contains() 运算符一起使用。您正在使用 All-operator,因此您不能在查询中使用本地序列。
  • 您能否提出解决上述问题的替代方法?谢谢。

标签: c# asp.net linq webforms


【解决方案1】:

确实不能使用 All 方法而只能使用 Contains 方法:

var q = from qua in qual
        join del in deliverables on qua.ID equals del.Q_ID
        where searchFilter.Contains(qua.Name) ||  searchFilter.Contains(qua.Project)...
        select qua;

当然,您可以将 linq 查询与表达式动态组合(但工作量可能更大),或者使用动态 linq。

【讨论】:

  • 这不会产生相同的结果。对于 Name = 'johnx' 的记录,您的查询不会返回结果,但来自 OP 的查询会(或者,这就是意图)。此外,.All 运算符仅在序列中的所有项目都适用时才会返回,而这是 Contains 不做的。
【解决方案2】:

别以为你有选择:

但是当您停留在“可查询”的世界中时,这只会生成一个 sql 请求(丑陋,但是...)

var q = from qua in qual
        join del in deliverables on qua.ID equals del.Q_ID
        select new{ qua, del};

foreach (var filter in searchFilter)
     q = q.Where(v => (v.qua.Name + " " + v.qua.Project + " " + v.qua.Summary + " " + v.del.Name + " " + v.del.Summary).ToLower().Contains(filter));

var result = q.Select(p => p.qua);

【讨论】:

  • 类似于 Amiram 的答案,这不会返回匹配数组中所有项目的结果。
  • 刚刚试了一下。奇怪的是,当它第二次绕过循环时,它不使用第一次通过的过滤结果,而是使用原始结果。 :S
【解决方案3】:

由于某种原因,contains 方法在第二次通过循环时没有使用过滤结果。最终奏效的方法是:

var SearchColumn = from qua in Qual
               join del in deliverables on qua.Q_ID equals del.Q_ID into left_j
                            from del in left_j.DefaultIfEmpty()
                            select new { qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower() };

foreach (var f in searchFilter)
{
   var likestr = string.Format("%{0}%", f);
   SearchColumn = SearchColumn.Where(x => SqlMethods.Like(x.Search_Col, likestr));
}

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2019-04-09
    • 2014-09-04
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多