【问题标题】:How to use "contains" or "like" in a dynamic linq query?如何在动态 linq 查询中使用“包含”或“喜欢”?
【发布时间】:2011-01-28 04:17:49
【问题描述】:

CSharpSamples.zip 中 Dynamic Linq 附带的帮助文件没有显示任何使用 contains 或 like 的示例。

是否有任何简单的解决方法可以做到这一点?即(col like @col)不起作用的地方。

【问题讨论】:

  • 请注意我在示例文件中讨论 Visual Studio 附带的 DYNAMIC LINQ。在这个版本中,我可以使用字符串“mycol = @mycol”定义 where 查询。我知道简单的案例。
  • 真正喜欢做的是在我的字符串中插入字符串“Like”代替“=”,并让Dynamic Linq 对其进行解析。但是,我会解决的。我认为没有添加它的原因是他们在没有此方法的 System.Linq.Expressions 上构建了解析器。
  • 要清楚,我可以这样做 "UserName = @0,Contact.FirstName = @1" 但不能这样做 "UserName like @0,Contact.FirstName like @1" 这些是字符串,并使用动态 LINQ 语法:dc.table.where(mystring, array)

标签: .net linq linq-to-sql dynamic


【解决方案1】:

这就是答案! Dynamic Linq 确实支持 .运算符,

根据文档:

"实例字段或实例属性 使用权。任何公共领域或财产 可以访问。”

因此,可以使用这种语法

.Where("MyColumn.Contains(@0)", myArray)

感谢所有建议!感谢我找到解决方案。

【讨论】:

  • 如何在可为空的列上做到这一点?
  • @Teddy .Where("MyColumn != null && MyColumn.Contains(@0)", myArray)
  • 如何将 Grid FilterExpression 转换为这种语法?有一些 NuGet 动态 LINQ 库,包括 .NET 4.0 支持......我们知道是否有任何添加了从 LIKE 到包含(或其他)的转换支持?
  • 是的,一旦 SQL Server 在未来版本(2016 年?)中永久启用 ANSI_NULL,您最好检查 null。当 x 为空时,x not like '%something%'x like '%something%' 都将评估为 false,因为这两种情况下的比较结果都是未知的。很不直观。或者,在比较之前将您的字段空合并为一个空字符串,如下所示:(MyColumn ?? "").Contains(@0),LINQ 有望在“like”比较之前将其转换为 SQL ISNULL 函数调用。
  • 我想知道我是否可以在计算列中使用它进行搜索?我想在 Select 调用中使用上述语法,因此我可以返回布尔列,告诉我该值是否包含搜索词。
【解决方案2】:

对我来说,解决方案是 outerIt

   class User { public string Name { get; set; } }
   ...
   IQueryable<User> query = db.Users;
   ...
   query = query.Where("@0.Contains(outerIt.Name)", list);

请注意,outerIt 是一种库中内置的关键字(您无需修改​​它,因为您可以在此处的答案中阅读它)。您可以通过它访问查询类型的属性。

【讨论】:

    【解决方案3】:

    其实Linq2Sql里有direct对like运算符的支持:

    db.MyTable.Where(a => SqlMethods.Like(a.Name, "%"+searchTerm+"%"))
    

    看这里:

    http://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods_members.aspx

    ...但对于大多数应用程序,我更喜欢使用 startsWith、endsWith 和 contains。

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多