我有一个带有csv字段的Db表,名为" Line"。 字段中有几个值以分号分隔。
我正在尝试找到一个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 ...
}
最直接,最简洁的方法是什么?
答案 0 :(得分:1)
由于您似乎正在使用DbContext
并且没有机制来翻译拆分字符串或按索引搜索,您需要获取超出必要数据的更多数据,然后在linq-中过滤到对象。您可以使用初始基本过滤器来限制返回的行数,但是您需要在内存中进行剩余的过滤:
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 ...
}
答案 1 :(得分:0)
如果你只是想检查一下,Linq是一个简单的方法。
请执行以下操作:
您应该考虑规范化您的数据,因为存储冗余/非标准化数据可能会导致其他问题。
修改强>
好的,在这种情况下使用linq并不像我想的那么容易,因为我们没有任何索引信息。这很容易,应该有效:
string line = "value1;apple;value3;value4";
string[] splitted = line.Split(new char[] { ';' });
if (splitted.Length > 1 && splitted[1] == "apple")
{
Console.WriteLine("APPLE!");
}
答案 2 :(得分:0)
据我所知,你的表(dbContext)包含一组行(Test)?
你可以使用'where'将该集合减少到只满足条件的元素(在这种情况下,我用分号分割字符串,看看第二个字符串是否等于apple。'任何'将会如果有一个或多个匹配则返回true。
if(dbContext.Test.Where(x => x.Line.Split(';')[1] == "apple").Any())
{
// Do the thing
}