Я не уверен, что у меня есть полное представление о том, что вы пытаетесь сделать.Что значит «использовать его в этом сценарии»?Можете ли вы имитировать свою предыдущую технику с помощью чего-то подобного, чтобы инкапсулировать создание 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)
});
Довольно аккуратно, верно?