在Linq查询表达式(query format)中重复使用表达式

3

我有一个表达式,可以将一种对象转换为另一种类型的对象。该表达式如下:

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子句中执行此操作的参考。如果我能够使用函数调用来做到这一点,那么使用查询语法应该是可行的。

使用查询语法的重要原因是一些被选中的对象由许多子对象组成,尝试使用函数符号将它们所有的转换链接在一起将更难编写和维护。

1个回答

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);

那有帮助吗?

是的,这非常有帮助。我之前没有考虑过在与表连接之前将选择函数应用于它,我一直在试图在收集完所有数据后再进行操作。非常感谢你。 - David Burhans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接