我使用的是一个根据id返回Domains的视图。Domains列可以是"Geography",也可以是填充域"Geographicy,History"。(无论如何,返回的数据都是VARCHAR)
在我的C#代码中,我有一个包含主要域的列表:
private static List<string> _mainDomains = new List<string>()
{
"Geography",
"Mathematics",
"English"
};
我想过滤我的LINQ查询,以便只返回与一个或多个主域相关的数据:
expression = i => _mainDomains.Any(s => i.Domains.Contains(s));
var results = (from v_lq in context.my_view
select v_lq).Where(expression)
问题是我不能使用Any
关键字和Exists
关键字,因为它们在SQL中不可用。我见过许多使用Contains
关键字的解决方案,但它不适合我的问题。
我该怎么办?
您可以使用contains:
where i.Domains.Any(s => _mainDomains.Contains<string>(s.xxx))
请注意,泛型参数是必需的(即使Resharper可能会告诉您它们不是必需的)。他们需要选择Enumerable.Contains
,而不是List.Contains
。后一个是不可翻译的(我认为这是L2S产品设计中的一个错误)。
(我可能没有得到完全适合您的数据模型的查询。请根据您的需要进行调整)。
我想明白了。由于我不能使用Any
关键字,所以我使用了以下功能:
public static bool ContainsAny(this string databaseString, List<string> stringList)
{
if (databaseString == null)
{
return false;
}
foreach (string s in stringList)
{
if (databaseString.Contains(s))
{
return true;
}
}
return false;
}
因此,我可以在Where
子句中使用以下表达式:
expression = i => i.Domains.ContainsAny(_mainDomains);
更新:根据usr的说法,查询将返回所有值,并在服务器端执行where子句。更好的解决方案是使用不同的方法(而不是使用填充/逗号分隔的值)