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



我使用的是一个根据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子句。更好的解决方案是使用不同的方法(而不是使用填充/逗号分隔的值)

相关内容

  • 没有找到相关文章

最新更新