首页 > 后端开发 > C++ > 如何将 LINQ 表达式从'obj => obj.Prop”转换为'parent =>parent.obj.Prop”?

如何将 LINQ 表达式从'obj => obj.Prop”转换为'parent =>parent.obj.Prop”?

Patricia Arquette
发布: 2025-01-18 07:17:09
原创
490 人浏览过

将LINQ表达式“obj => obj.Prop”转换为“parent => parent.obj.Prop”

在某些情况下,需要将直接从对象选择属性的LINQ表达式转换为通过父对象选择属性的表达式。例如,需要将类似“cust => cust.Name”的表达式转换为“parent => parent.Customer.Name”。

为此,可以使用表达式组合的概念。这涉及创建一个函数,该函数接受两个表达式作为参数:一个选择属性,另一个选择包含该属性的对象。以下代码示例提供了一种使用此方法的解决方案:

<code class="language-csharp">public static Expression<Func<TFirst, TResult>> Compose<TFirst, TIntermediate, TResult>(
    this Expression<Func<TFirst, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TFirst, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>
登录后复制

此外,还需要一个名为“Replace”的辅助方法来替换一个表达式的所有出现:

<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;

    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }

    public override Expression Visit(Expression ex)
    {
        if (ex == from) return to;
        else return base.Visit(ex);
    }
}

public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>
登录后复制

使用这些辅助方法,现在可以像这样组合表达式:

<code class="language-csharp">// 从对象中选择一个属性
Expression<Func<Customer, string>> propertySelector = cust => cust.Name;

// 从模型中选择对象
Expression<Func<Model, Customer>> modelSelector = model => model.Customer;

// 组合两个表达式
Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
登录后复制

这种方法为组合表达式以访问嵌套属性提供了一种灵活的解决方案,使其适用于各种场景,包括MVC方法参数。

How to Convert a LINQ Expression from obj.Prop" to "parent => parent.obj.Prop"? " />

以上是如何将 LINQ 表达式从'obj => obj.Prop”转换为'parent =>parent.obj.Prop”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板