如何将表达式应用于单个项目?现在我有一个表达式,可以在列表或任何支持Select扩展方法的集合上使用。我想将该功能扩展到单个对象。这是一个澄清我的意思的例子:
private static readonly Expression<Func<Book, BookDto>> AsBookDto =
x => new BookDto
{
Title = x.Title,
Author = x.Author.Name,
Genre = x.Genre,
Description = x.Description,
Price = x.Price,
PublishDate = x.PublishDate
};
通过这个表达式,我可以这样做:
IQueryable<BookDto> books = db.Books.Include(b => b.Author)
.Where(x => x.AuthorId == authorId).Select(AsBookDto);
我正在寻找的是一种重用该Expression的方法,这样当我在一个方法中收到一本包含作者的书时,我可以这样做:
public BookDto SampleMethod(Book propertiesIncludedBook)
{
//this does not compile because Book does not have a Select method.
return propertiesIncludedBook.Select(AsBookDto);
}
答案 0 :(得分:1)
大多数LINQ扩展都适用于IEnumerable
或IQueryable
,在您的情况下,您需要的只是普通函数/委托,但如果您想保持相同的语法,使用LINQ只需编写自己的扩展方法:
public static TOutput SelectSingle<TInput, TOutput>(
this TInput obj,
Expression<Func<TInput, TOutput>> expression)
{
return expression.Compile()(obj);
}
用作:
public BookDto SampleMethod(Book propertiesIncludedBook)
{
return propertiesIncludedBook.SelectSingle(AsBookDto);
}
错误检查被省略但是你可以看到直接使用它没有这样的好处:
public BookDto SampleMethod(Book propertiesIncludedBook)
{
return AsBookDto.Compile()(propertiesIncludedBook);
}
编辑替代拆分表达式定义与单独的Func<Book, BookDto>
工作,但使表达本身相当无用。除去。