通过 LINQ 检查分隔字段中的值

Check for value in delimitted field via LINQ

我有一个 Db table,其中有一个名为 "Line" 的 csv 字段。 字段中有几个值,用分号隔开。

我试图找到一个 LINQ 表达式来检查是否有任何行的 "Line" 字段中的第二个值具有特定值。

类似于:

if (dbContext.Test.Any(t => Array.IndexOf(t.Line.Split(';'), value) = 1))
{
Do something ...                          
}

示例:

Line = "value1;apple;value3;value4"
if (dbContext.Test.Any("second value in Line field equals 'apple'"))
{
Do something ...
}

最直接、最简洁的方法是什么?

如果您只想检查值,Linq 是一个简单的方法。

只需执行以下操作:

  1. 走专栏
  2. Splitt 它的内容
  3. 如果拆分列表中有多个元素继续
  4. 证明第二个元素是否是你要找的。

您应该考虑规范化您的数据,因为存储 redundant/unnormalized 数据可能会导致其他问题。

编辑

好的,在这种情况下使用 linq 并不像我想象的那么容易,因为我们没有任何索引信息。这很简单,应该可行:

string line = "value1;apple;value3;value4";
string[] splitted = line.Split(new char[] { ';' });
if (splitted.Length > 1 && splitted[1] == "apple")
{
    Console.WriteLine("APPLE!");
}

据我了解,您的 table (dbContext) 包含一组行 (Test)?

您可以使用 'where' 将该集合缩减为仅满足条件的元素(在这种情况下,我用分号拆分字符串并查看第二个字符串是否等于 apple.如果有一个或多个匹配项,'Any' 将 return 为真。

        if(dbContext.Test.Where(x => x.Line.Split(';')[1] == "apple").Any())
        {
            // Do the thing
        }

由于您似乎在使用 DbContext 并且没有翻译拆分字符串或按索引搜索的机制,因此您需要获取比必要更多的数据,然后在 linq-to-objects 中进行过滤。您可以使用初始基本过滤器来限制返回的行数,但您需要在内存中执行剩余的过滤:

var queryEF = dbContext.Test
                       .Where(t => t.Line.Contains(";" + value" + ";");

var queryMemory = queryEF.AsEnumerable()   // shift to Linq-to-Objects
                         .Where((t => Array.IndexOf(t.Line.Split(';'), value) == 1);

if (queryMemory.Any())
{
    //Do something ...
}