c# - 在 Linq select 子句中重用表达式(查询格式)

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

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

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 子句中找到有关执行此操作的引用资料。看来,如果我能够使用函数调用来执行此操作,则应该可以使用查询语法。

使用查询语法很重要的原因是一些被选择的对象是由许多子对象组成的,并且试图将它们与函数符号链接(symbolic link)在一起的所有转换将更难实现编写和维护。

最佳答案

It seems that if I'm able to use the function calls to do this, it should be possible using the query syntax.

那不是真的。查询符号总是 通过 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);

这有什么帮助吗?

关于c# - 在 Linq select 子句中重用表达式(查询格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3259901/

相关文章:

c# - ASP.Net TableHeaderRow Controller 产生 tr 而不是 th

c# - Xamarin 表单 - 自定义 JSON 的可观察集合

c# - 异常 : Type arguments cannot be inferred when using LINQ

c# - 远离数据库实现事务有什么缺点?

c# - 从 C# 调用非托管 C++ 类 DLL

c# - Visual Studio 崩溃! - 在实例化枚举器后修改了集合

c# - IQueryable 不包含 ToList()

c# - GroupBy 和 Sum

.net - 任何用于医疗诊断和数据挖掘的 .NET 开源项目

c# - 将数据从 C++ 传递到 C#