通过 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 是一个简单的方法。
只需执行以下操作:
- 走专栏
- Splitt 它的内容
- 如果拆分列表中有多个元素继续
- 证明第二个元素是否是你要找的。
您应该考虑规范化您的数据,因为存储 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 ...
}
我有一个 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 是一个简单的方法。
只需执行以下操作:
- 走专栏
- Splitt 它的内容
- 如果拆分列表中有多个元素继续
- 证明第二个元素是否是你要找的。
您应该考虑规范化您的数据,因为存储 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 ...
}