2

我正在使用根据 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关键字的解决方案,但它不适合我的问题。

我该怎么办?

4

2 回答 2

3

您可以使用包含:

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

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

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

于 2012-09-07T20:15:52.830 回答
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 子句。更好的解决方案是使用不同的方法(而不是使用填充/逗号分隔的值)

于 2012-09-07T20:46:53.303 回答