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

本文关键字:字段 分隔 LINQ 检查 通过 | 更新日期: 2023-09-27 18:13:03

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

我试图找到一个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检查分隔字段中的值

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

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 ...
}

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

只需做以下操作:

  1. 拆分内容
  2. 如果拆分列表中有多个元素,继续
  3. 证明第二个元素是否是您正在寻找的。

你应该考虑规范化你的数据,因为存储冗余/非规范化的数据可能会导致其他问题。

编辑

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

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

因此,据我所知,您的表(dbContext)包含行(Test)的集合?

您可以使用'where'将集合减少到只包含满足条件的元素(在本例中,我将字符串用分号分开,看看第二个字符串是否等于apple)。如果有一个或多个匹配项,'Any'将返回true。

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