在Linq select子句中重用Expression(查询格式)

时间:2010-07-15 20:43:52

标签: c# .net linq linq-to-sql

我有一个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子句中找到这样做的引用。似乎如果我能够使用函数调用来执行此操作,则应该可以使用查询语法。

使用查询语法很重要的原因是,正在选择的一些对象由许多子对象组成,并尝试将所有转换与函数符号链接起来将更加困难写作和维护。

1 个答案:

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

这有帮助吗?