从单个对象中选择表达式

时间:2014-03-16 08:07:05

标签: c# .net linq

如何将表达式应用于单个项目?现在我有一个表达式,可以在列表或任何支持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);
}

1 个答案:

答案 0 :(得分:1)

大多数LINQ扩展都适用于IEnumerableIQueryable,在您的情况下,您需要的只是普通函数/委托,但如果您想保持相同的语法,使用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>工作,但使表达本身相当无用。除去。