【发布时间】:2010-11-15 11:28:05
【问题描述】:
假设我有这个视图模型:
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; }
}
为方便起见,我将投影功能放在那里,所以现在我可以说:
var links = dc.Series.Select(SeriesLinkViewModel.FromSeries);
太棒了。但是,如果我想添加到此查询中该怎么办?假设我还想从表中提取 Description 列。通常,我可以只做一个select new { } 并将Description 放在那里,但我不能完全这样做,因为我只能在 `.Select() 中放置一个投影函数。
我希望我能做这样的事情:
q = from s in dc.Series
select new
{
Series = SeriesLinkViewModel.FromSeries.Compile()(s),
Description = s.Description
};
但我得到一个例外:
System.InvalidCastException:无法 类型的转换对象 'System.Linq.Expressions.FieldExpression' 输入 'System.Linq.Expressions.LambdaExpression'。
或者我至少可以以某种方式在一次往返中完成所有这些查询吗?我知道 TransactionScope 可用于进行更改,但我认为它不会导致查询一次完成。
【问题讨论】:
-
我不确定您遇到了什么问题。为什么不将
Description列添加到SeriesLinkViewModel或创建一个包含Description的新ViewModel 类? -
这是一个简单的例子。问题是当我有更多的查询组合要做时。然后我可以进行非常粗略的查询来检索大量的东西,或者我拥有大量的 ViewModel,除了我无法编写精明的查询之外没有什么特别好的理由。
标签: linq linq-to-entities