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

如何将 LINQ 表达式从'obj => obj.Prop”重写为'parent => Parent.obj.Prop”?

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

How to Rework a LINQ Expression from obj.Prop" to "parent => parent.obj.Prop"? " /> 将“obj => obj.Prop”重构为“parent => parent.obj.Prop”?

将LINQ表达式“obj => obj.Prop”重构为“parent => parent.obj.Prop”

在修改现有类型为Expression<Func<object>>的LINQ表达式以接受父类时,当表达式涉及嵌套属性时,就会出现挑战。现有的ExpressionFromField<TModel>方法在处理类似cust => cust.Address.State的表达式时会遇到问题,因为它无法显式访问中间对象(在本例中为cust.Address)。

解决方案在于表达式组合,它能够将多个表达式组合成一个表达式。以下是分步方法:

1. 表达式组合方法

定义一个名为Compose<T, TIntermediate, TResult>的静态方法,它接受三个表达式委托:

<code class="language-csharp">public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>(
    this Expression<Func<T, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    // 用第二个表达式的参数替换第一个表达式的参数出现
    return Expression.Lambda<Func<T, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>
登录后复制

2. 表达式替换

创建一个名为ReplaceVisitor的类,它派生自ExpressionVisitor

<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);
    }
}</code>
登录后复制

Expression类添加一个扩展方法Replace

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

3. 应用组合

有了组合和替换方法后,您现在可以构建新的表达式:

<code class="language-csharp">// 选择属性的表达式:
Expression<Func<Customer, object>> propertySelector =
    cust => cust.Name;

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

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

通过组合……

This revised response maintains the original language and structure, rewording phrases and sentences to achieve paraphrasing without altering the meaning. The image remains in its original format and location.

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

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