【问题标题】:Like in Lambda Expression and LINQ就像在 Lambda 表达式和 LINQ 中一样
【发布时间】:2011-04-06 16:25:04
【问题描述】:

我该如何做这样的事情:

customers.where(c=>c.Name **like** "john");

我知道这是不可能的,但我想知道我怎样才能拥有类似的东西。

【问题讨论】:

  • 其实可以生成like语句。看看herehere 有很好的例子。
  • 如果您使用 LINQ to SQL,请选择@Johannes 的答案;否则 - @Tom 的。
  • 实际上我没有使用 LINQ 到 SQL包含”表达式,看看它是否会起作用。谢谢大家。

标签: c# linq lambda


【解决方案1】:

这是我的代码:

string s="somethings";

customers.Where(c => c.Name != null && c.Name.ToLower().Contains(s.ToLower()));

类似的东西。

【讨论】:

    【解决方案2】:

    如果您的目标是 LINQ to SQL,请使用SqlMethods.Like

    customers.Where(c => SqlMethods.Like(c.Name, "%john%")); 
    

    解释:

    编译器将从上面的语句生成一个表达式树。由于LIKE 是特定于SQL 的构造,并非对所有LINQ 查询提供程序都通用,因此SqlMethods 类及其成员用作表达式编译器(将表达式树编译为SQL)的“提示”以发出LIKE声明。

    【讨论】:

    • 这(当然)仅适用于 LINQ to SQL,不适用于 LINQ to Entities 或“LINQ to Enumerable”,即 LINQ to Objects。
    • 是的,我假设他正在使用 LinqToSql。我觉得使用 string.contains 太明显了?!
    【解决方案3】:

    首先想到的是Regex.IsMatch

    这将最接近提供您从LIKE 获得的那种功能;例如,你可以这样做:

    var matches = people.Where(p => Regex.IsMatch(p.Name, "A.*[mn]"));
    
    foreach (Person match in matches)
    {
        Console.WriteLine(match.Name);
    }
    

    得到这样的输出:

    亚当 亚伦 艾丹

    如果您的意图只是在Name 中查找特定子字符串,那么几乎可以肯定的是,正如其他人所建议的那样,使用string.Contains 更可取。

    【讨论】:

    • 现在你有两个问题:)。
    • @Phil:确实,我什至不知道发布这个答案是什么感觉。无论如何,我将其作为一种选择。也许有人会过来指出这是一个可怕的建议;我不知道。
    • @Michael,这不是一个可怕的建议,我只是在引用一句名言:有些人在遇到问题时会想“我知道,我会使用正则表达式。 ”现在他们有两个问题。
    • 哦,我明白了。知道 RegExes 我什至明白为什么这句话出名了:-)
    • @PhilGan 我喜欢这个笑话。这很有趣,因为它是真实的,它很复杂,因为它是在这个星球上行走的一小部分人独有的。
    【解决方案4】:
    customers.Where(c => c.Name.Contains("john"));
    

    【讨论】:

    • +1。完美的。将 LINQ over enumerables (LINQ to Object) 用作 LINQ over 表达式树(LINQ to SQL、LINQ to Entities 等)。
    • 不区分大小写吗?
    【解决方案5】:
    using System.Data.Linq.SqlClient;
    ...
    customers.where(c=>SqlMethods.Like(c.Name, "john"));
    

    【讨论】:

      【解决方案6】:

      在您的 where 语句中使用 Regex.IsMatch 或更简单的不带通配符等的版本:

      customers.where(c=>c.Name.Contains("john"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多