C # Linq Содержит утверждение - PullRequest
2 голосов
/ 25 марта 2011

Я написал свой собственный объект Tag, и я хотел бы, чтобы он содержал, если найдено .Value (я хочу смоделировать WHERE IN, как в SQL)

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

Проблема в том, если Contains находится взапрос, я получаю

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

Где Literal является основой тега.

Что я могу сделать?

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

Вы пытаетесь сделать 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) { };
2 голосов
/ 25 марта 2011

если tags является List<string>, вы должны обнаружить, что:

where tags.Contains(t.Name)

работает нормально;но есть пределы тому, что он может понять (и, что более важно, написать как TSQL).

1 голос
/ 25 марта 2011

Оператор LinQ Contains() может быть преобразован в SQL, только если он выполняется List, содержащим основные типы данных, такие как int или string. Если вам нужно привести свой список tags к списку строк или целых, то он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...