我有一个Expression,它将一种类型的对象转换为另一种类型。表达式如下:
public Expression<Func<SQLRepository.ActionType, Model.ActionType>> DBActionTypeToActionType =
(SQLRepository.ActionType at) => new Model.ActionType()
{
ID = at.OID,
DisplayName = at.DisplayName
};
我可以像这样使用Expression:
var linq = (from at in dc.SQLRepositoryDC.ActionTypes select at).Select(DBActionTypeToActionType);
但我想像这样使用它:
var linq = (from at in dc.SQLRepositoryDC.ActionTypes select DBActionTypeToActionType.Compile().Invoke(at));
我一直在寻找几天,我只能在Where子句中找到这样做的引用。似乎如果我能够使用函数调用来执行此操作,则应该可以使用查询语法。
使用查询语法很重要的原因是,正在选择的一些对象由许多子对象组成,并尝试将所有转换与函数符号链接起来将更加困难写作和维护。
答案 0 :(得分:4)
似乎如果我能够使用函数调用来执行此操作,则应该可以使用查询语法。
那不是真的。查询表示法始终通过lambda表达式进行。例如
from x in y select z
结束为
y.Select(x => z)
这意味着如果你已经有一个表达式树,你想直接作为Select
的参数传递,你就不能使用查询表达式,因为有这种额外的间接层。
现在可用的选项取决于您需要应用预定义表达式的位置。您始终可以在源中使用它,然后继续查询:
var query = from foo in dc.ActionTypes.Select(DBActionTypeToActionType)
where foo.Stuff
select foo.Other;
或者在最后使用它很容易:
var query = (from bar in dc.ActionTypes
where bar.Stuff
select bar).Select(DBActionTypeToActionType);
这有帮助吗?