2011-03-25 108 views
2

我写我自己的对象标签,我想向包含如果.value的发现(我想模拟凡在像SQL)C#的LINQ包含声明

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的基础。

我该怎么办?

+2

您应该为您使用的ORM框架添加标签。 – CodesInChaos 2011-03-25 14:03:58

+0

你的代码无论如何都不会起作用。标签如何包含标签对象的新实例? – ChrisF 2011-03-25 14:05:13

+1

*** *** ****是在这里声明的吗? – 2011-03-25 14:05:40

回答

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) { }; 
+0

Perfercto!谢谢! – Himberjack 2011-03-25 14:08:33

1

LINQ的Contains()语句只能被翻译如果它是由像intstring一个List包含基本数据类型进行SQL。如果你需要将你的tags列表转换为字符串或整数列表,那么它应该可以工作。

+0

我该怎么做? – Himberjack 2011-03-25 14:07:41

+0

我不认为*演员*在这方面是正确的词,我认为这可能是更准确的说这是一个投影。 – R0MANARMY 2011-03-25 14:09:35

2

如果tagsList<string>,你会发现,:

where tags.Contains(t.Name) 

正常工作;但它可以理解的限制(更重要的是,写作TSQL)。