LINQ to SQL where子句验证字符串包含list元素

时间:2012-09-07 20:09:35

标签: c# linq linq-to-sql predicates

我正在使用根据id返回域名的视图。域名列可以是“地理位置”,也可以是填充域名“地理位置,历史记录”。 (无论如何,返回的数据是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关键字的解决方案,但它不适合我的问题。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

您可以使用contains:

where i.Domains.Any(s => _mainDomains.Contains<string>(s.xxx))

请注意,通用参数是必需的(即使Resharper可能会告诉您它们不是)。他们需要选择Enumerable.Contains,而不是List.Contains。后者是不可翻译的(我认为这是L2S产品设计中的错误)。

(我可能没有完全适合您的数据模型的查询。请根据您的需要调整它。)

答案 1 :(得分:0)

我明白了。由于我无法使用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子句服务器端。更好的解决方案是使用不同的方法(而不是使用填充/逗号分隔值)