通过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 ...
}
最直接、最简洁的方法是什么?
由于您似乎正在使用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是一个简单的方法。
只需做以下操作:
- 取 列
- 拆分内容
- 如果拆分列表中有多个元素,继续
- 证明第二个元素是否是您正在寻找的。
你应该考虑规范化你的数据,因为存储冗余/非规范化的数据可能会导致其他问题。
编辑
好吧,在这种情况下使用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
}