Linq to SQL создает пользовательский объект извне - PullRequest
3 голосов
/ 20 июля 2011

Я хочу добиться следующего:

return  (from a in db.Tags
    select new TagItem
    {
        ID = a.Id,
        Name = a.Name
    });

.. но я не хочу этого достигать, потому что мне нужно использовать точно такую ​​же конструкцию TagItem в другом месте (для объединения)

Итак, это намерение вызвать метод, который создает TagItem для меня:

return (from a in db.Tags
    select ConstructTagItem(a));

И метод создает объект таким же образом:

private TagItem ConstructTagItem(Tag a)
{
    return new TagItem { ID = a.Id, Name = a.Name};
}

Но это дает мне следующую ошибку:

Метод 'TagItem ConstructTagItem (Tag)' не поддерживает перевод в SQL.

Есть ли способ достичь этого?

Решение (спасибо Даниэль Хилгарт):

return db.Tags.Select(ConstructTagItem);

И метод:

private Expression<Func<Tag, TagItem>> ConstructTagItem
{
    get { return a => new TagItem {ID = a.Id Name = a.Name }; }
}

1 Ответ

3 голосов
/ 20 июля 2011

Да, есть.Вам нужно использовать дерево выражений, например:

Expression<Func<Tag, TagItem>> constructTagItem = a => return new TagItem
                                                       { ID = a.Id, 
                                                         Name = a.Name};

И затем вы можете использовать это выражение вместо вашего метода:

return db.Tags.Select(constructTagItem);

Согласно этой статье вам нужно использовать метод цепочки способ определения вашего запроса.

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