【问题标题】:LINQ select with more than one condition using OR使用 OR 选择具有多个条件的 LINQ
【发布时间】:2020-09-29 02:25:32
【问题描述】:

我将传递一个列表到 linq 进行搜索

例如:

List<string> test = new List<string> {"a","b","c","d"}
var list = db.table.where(t => t.testName.Contains(test)).toList;

希望能选中所有testName为a/b/c/d的记录。在SQL语句中,应该是

select * from table where testName = 'a' OR testName = 'b' OR testName = 'c' OR testNmae = 'd'

在实际程序中,列表将是动态的,因此可以确保大小为 1 或 99。

但是当我尝试使用 .Contains 时,它会抛出 Contains 无法将 List 转换为字符串的错误。

【问题讨论】:

  • var list = db.table.where(t =&gt;test.Contains(t.testName)).toList(); ?

标签: c# linq linq-to-sql


【解决方案1】:

您有一个List&lt;string&gt;,并且您想要测试一个列以查看它(string)是否包含与您的List 中的任何匹配的子字符串。所以试试

var list = db.table.Where(t => test.Any(t.testName.Contains)).ToList();

如果你想检查是否真的相等,那么使用

var list = db.table.Where(t => test.Any(tt => t.testName == tt)).ToList();

【讨论】:

    【解决方案2】:

    唉,你忘了给我们db.Table的类型,但它似乎返回了一系列相似的对象,其中每个对象都有一个字符串属性TestName。 为了方便讨论,假设您的表格包含Tests,表格的每一行都是一个Test,每个Test 都有一个字符串属性TestName

    要求给定一个字符串序列,给我表中所有 TestName 等于字符串序列中的一个元素的测试。

    在您的代码db.table.where(t =&gt; 中,每个 t 都是一个测试。

    因此,您只想保留那些在您的字符串序列中有名称的测试:

    var requiredTestNames = new List<string> {"a","b","c","d"};
    var testsWithRequiredTestName = db.Table
        .Where(test => requiredTestNames.Contains(test.TestName))
        .ToList();
    

    言辞:

    我有一系列必需的测试名称。从填满测试的表中,只保留值 test.TestName 在 requiredTestNames 中的那些测试。

    顺便说一句:您是否发现通过使用描述其含义的标识符、正确使用单数和复数名词,代码的可读性要好得多,并且看起来更符合您的要求?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多