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

Продолжение этого решения (спасибо Дэниел Хилгарт)

return db.Tags.Select(ConstructTagItem());

И метод:

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

Дополнительный вопрос, какзатем использовать его в этом сценарии:

return (from c in db.News_Attributes
        select new NewsTagItem
        {
            NewsID = c.News_Id,
            TagID = c.Tag_Id,
            Content = c.Content,
            Attribute = new TagItem
            {
                ID = c.Tag.Id,
                Name = c.Tag.Name
            }
        });

Я хочу использовать метод из другого ответа:

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

Чтобы построить что-то вроде этого:

return (from c in db.News_Attributes
        select new NewsTagItem
        {
            NewsID = c.News_Id,
            TagID = c.Tag_Id,
            Content = c.Content,
            Attribute = ConstructTagItem // TODO: need some way to tell the method that it should use c.Tag
        });

Я хочу использовать одну и ту же конструкцию моего TagItem в нескольких местах.Это облегчит изменение объекта и сохранит строки.

Полагаю, мне нужно как-то определить, что это c.Tag в ConstructTagItem(), но я действительно мало что знаю о выражениях,Поэтому я надеюсь, что кто-то может помочь?

1 Ответ

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

Я не уверен, что у меня есть полное представление о том, что вы пытаетесь сделать.Что значит «использовать его в этом сценарии»?Можете ли вы имитировать свою предыдущую технику с помощью чего-то подобного, чтобы инкапсулировать создание NewsTagItem, или вы пытаетесь достичь чего-то еще?

private Expression<Func<News_Attribute, NewsTagItem>> ConstructNewsTagItem()
{
    return c => new NewsTagItem 
    {
        NewsID = c.News_Id,
        Name = a.Name 
        TagID = c.Tag_Id,
        Content = c.Content,
        Attribute = new TagItem
        {
            ID = c.Tag.Id,
            Name = c.Tag.Name
        }
    }
});

db.News_Attributes.Select(ConstructNewsTagItem());

ОБНОВЛЕНИЕ:

ОК, мы не можем напрямую повторно использовать ваш ConstructTagItem (), потому что он возвращает выражение, содержащее функцию.Что вам нужно, это MemberInitExpression.Это немного сложно создать вручную, но мы можем использовать хитрость, при которой мы создаем желаемое выражение, обернутое с thunk, чтобы оно не оценивалось, а затем берем тело thunk, чтобы получить выражение.Смотрите фрагмент ниже:

private Expression GenerateNewTagItem(TagItem c)
{
    Expression<Func<TagItem>> expr = () => new TagItem { ID = c.ID, Name = c.Name };
    return expr.Body;
}

С помощью этой функции мы можем теперь делать в точности то, что вы хотите:

return (from c in db.News_Attributes
    select new NewsTagItem
    {
        NewsID = c.News_Id,
        TagID = c.Tag_Id,
        Content = c.Content,
        Attribute = GenerateNewTagItem(c)
    });

Довольно аккуратно, верно?

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