我有一个将一种类型的对象转换为另一种类型的表达式。表达式如下:
public Expression<Func<SQLRepository.ActionType, Model.ActionType>> DBActionTypeToActionType =
(SQLRepository.ActionType at) => new Model.ActionType()
{
ID = at.OID,
DisplayName = at.DisplayName
};
我可以这样使用表达式:
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 子句中找到执行此操作的参考。看来,如果我能够使用函数调用来执行此操作,那么应该可以使用查询语法。
使用查询语法很重要的原因是,某些正在选择的对象由许多子对象组成,并且尝试将它们所有转换与函数符号链接在一起将更加难以编写和维护。
看来,如果我能够使用函数调用来执行此操作,那么应该可以使用查询语法。
这不是真的。查询符号always通过 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);
这些帮助有用?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)