C#Linq包含声明

时间:2011-03-25 14:01:48

标签: c# linq linq-to-sql

我编写了自己的对象标签,我想包含是否找到.Value(我想在SQL中模拟WHERE IN)

public static List<Question> GetQuestionsIdsWithTags(List<Tag> tags)
        {
    IEnumerable<Question> res = from t in dataClasses.tags
                                    join
                                    qt in dataClasses.question_to_tags on t.id equals qt.tag_id
                                    join q in dataClasses.questions on qt.question_id equals q.id
                                    where tags.Contains<Tag>(new Tag(t.name))
                                    select new Question(q.text) { };

问题是,如果包含在查询中,我会得到

The member 'Core.Literal.Value' has no supported translation to SQL.

Literal是Tag的基础。

我该怎么办?

3 个答案:

答案 0 :(得分:3)

您正在尝试执行new Tag(t.name),但这无法转换为SQL(数据库服务器无法创建Tag类的新实例)。也许这会奏效:

IEnumerable<Question> res = from t in dataClasses.tags
                            join
                            qt in dataClasses.question_to_tags on t.id equals qt.tag_id
                            join q in dataClasses.questions on qt.question_id equals q.id
                            where tags.Select(x => x.name).Contains(t.name)
                            select new Question(q.text) { };

答案 1 :(得分:2)

如果tagsList<string>,您应该找到:

where tags.Contains(t.Name)

工作正常;但它能理解的内容是有限的(更重要的是,写成TSQL)。

答案 2 :(得分:1)

如果LinQ Contains()语句由包含Listint等基本数据类型的string执行,则只能将其翻译为SQL。如果您需要将tags列表转换为字符串或整数列表,那么它应该可以正常工作。