如何在Linq(到EF或SQL)中组合多个重构的Select表达式?

Rei*_*aka 3 linq linq-to-entities

说我有这个视图模型:

public class SeriesLinkViewModel
{
    public static Expression<Func<Series, SeriesLinkViewModel>> FromSeries =
        s => new SeriesLinkViewModel
        {
            Name = s.Name,
            Slug = s.Slug,
        };

    public string Name { get; set; }
    public string Slug { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

为方便起见,我将投影功能放在那里,所以现在我可以说:

var links = dc.Series.Select(SeriesLinkViewModel.FromSeries);
Run Code Online (Sandbox Code Playgroud)

真棒.但是,如果我想添加到此查询,该怎么办?说我也想Description从表中拉出一列.通常,我可以做一个select new { }并放在Description那里,但我不能那样做因为我只能在`.Select()中放一个投影函数.

我希望我能做到这样的事情:

q = from s in dc.Series
    select new
    {
        Series = SeriesLinkViewModel.FromSeries.Compile()(s),
        Description = s.Description
    };
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外:

System.InvalidCastException:无法将类型为"System.Linq.Expressions.FieldExpression"的对象强制转换为"System.Linq.Expressions.LambdaExpression".

或者我可以至少在一次往返中完成所有这些查询吗?我知道TransactionScope可以进行更改,但我认为它不会导致查询一次完成.

Rei*_*aka 6

LinqKit解决了这个问题:

var fs = SeriesLinkViewModel.FromSeries; //needs to be local for some reason
q = from s in dc.Series.AsExpandable() //enables LinqKit to do its magic
    select new
    {
        Series = fs.Invoke(s), //and voila!
        Description = s.Description
    };
Run Code Online (Sandbox Code Playgroud)