【问题标题】:LINQ : How to check CONTAINS with multiple dynamic input valuesLINQ:如何使用多个动态输入值检查 CONTAINS
【发布时间】:2012-04-30 10:59:51
【问题描述】:

我遇到了一个关于 LINQ 查询的问题。

我有多个输入值存储在 List 变量中。

我必须形成一个 LINQ 查询,其中包含一个 where 子句,该子句使用 CONTAINS 关键字检查相应的列。我面临的问题是 List 可以包含任意数量的值。

所以我想知道如何形成一个可以从集合对象读取输入值的查询。并显示结果。

任何建议都将不胜感激。

提前致谢。

【问题讨论】:

  • 我不能正确理解这个问题,你的意思是像 Select * from t where col in ('1','2'); ,或者您能否发布一些您到目前为止尝试过的代码以及您想要的代码
  • 您的意思是您需要查看 1. 列是否包含值(在这种情况下,您是否只有一个列要检查或多个)或 2. 表是否包含列?您的 List 是否实际上是列(或一组已知列)中的列名或预期值的列表?
  • 这是我在 Stackoverflow 上找到的最好的一个 stackoverflow.com/a/57625279

标签: linq linq-to-sql


【解决方案1】:

Linq 扩展方法:

public static bool ContainsAny<T>(this IEnumerable<T> Collection, IEnumerable<T> Values)
{
     return Collection.Any(x=> Values.Contains(x));
}

然后你可以像这样使用:

List<string> List1 = getStringList1();
List<string> List2 = getStringList2();

bool List2ItemsInList1 = List1.ContainsAny(List2);

【讨论】:

    【解决方案2】:

    你的问题不清楚。假设您有三个值 X、Y 和 Z。如果您想获取 Column 为 X、Y 或 Z 的结果,那么 habib-osu 的答案将执行此操作。

    如果您正在查找特定列包含 X、Y 和 Z 的所有记录,那么以下应该可以工作

    List<string> options = new List<string>();
    options.Add("X");
    options.Add("Y");
    options.Add("Z");
    
    var query = (from r in dc.Table select r); 
    foreach(var option in options)
       query = (from r in query where r.Column.Contains(option) select r);
    
    var list = query.ToList(); 
    

    这将产生一个类似于以下的 sql 查询

    select * from Table where Column like '%X%' and column like '%Y%' and column like '%Z%'     
    

    【讨论】:

    • 感谢 sgmoore 的建议,但它不能满足我的要求。恐怕,但这似乎是部分正确的建议。如果我的表“MyTable”在“MyColumn”中有值为“John”、“Joseph”、“Philip”并且我的 List 有一个值为“ph”的项目,那么它不会得到任何记录。它在 List 项中搜索整个值!
    • 您应该返回两条记录,即 Joseph 和 Philip。你的查询生成了什么sql?
    • 它给出了空的 IEnumerable !。记录集为空。
    • 我的意思是生成什么sql命令并发送到sql server。如果您查看 dc.GetCommand(query).CommandText 的值,您可以看到这一点
    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 2021-12-15
    • 2015-03-14
    • 2011-08-07
    • 2021-07-05
    • 2017-04-04
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多