假设我有一个表,其中包含字符串中的格式化值(nvarchar
) 柱子。这些值应该是由某个 const 符号分隔的字符串(让它成为分号;
)。例如,
12;0;5;dog //four values separated by a semi-colon
or
053 //if there is only one value, no semi-colon at the end
分隔符始终是分隔符,它不能是值的一部分。
我需要检查该表中是否已存在一行,该列中包含值列表,其中至少包含一个指定的项目。换句话说,我有一个值列表:
List<string> list = new List<string>() { "somevalue1", "somevalue2" };
分隔符:
string separator = ";";
我需要编写一个 linq-to-sql 查询来执行此操作:
select ... from sometable
where Value='somevalue1' or Value like 'somevalue1;%' or
Value like '%;somevalue1' or Value like '%;somevalue1;%'
or Value='somevalue2' or Value like 'somevalue2;%' or
Value like '%;somevalue2' or Value like '%;somevalue2;%'
应该指出的是,任何搜索到的值都可能包含另一个。也就是说,我可能正在寻找确切的5
,而某些行可能包含1;15;55
。这样的行必须not是一场比赛。尽管...;5;...
要不就5
, or 5;...
, or ...;5
是比赛。
使用 linq-to sql 我知道如何执行以下类型的查询:
select ... from sometable where (... or ... or ...) and (... or ...) ...
that is
IQueryable<SomeTable> query = dc.SomeTable;
foreach (string l in list)
{
string s = l;
query = query.Where(b => b.Value.StartsWith(s + separator) ||
b.Value.EndsWith(separator + s) ||
b.Value.Contains(separator + s + separator) ||
b.Value.Equals(s));
}
if (query.Any()) {/*...*/}
显然Where
语句与AND
在生成的 sql 查询中,而我需要OR
到处。
那么有没有办法在 C# 代码中获取我需要的查询?或者唯一的方法是通过手写查询来做到这一点DataContext.ExecuteQuery 方法?