热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

构建嵌套的条件表达式树

如何解决《构建嵌套的条件表达式树》经验,如何解决这个问题?

我正在尝试动态构建一些sql查询,具体取决于给定的配置,只查询所需的数据:

在编写简单的linq时,它看起来像这样:

var data = dbContext
.TableOne
.Select(t1 => new TableOneSelect
{
    TableOneId= t1.TableOneId,
    TableOneTableTwoReference= new[] { TableOne.FirstTableTwoReference.Invoke(t1) }
        .Select(t2 => new TableTwoSelect
        {
            TableTowId = (Guid?)t2.TableTwoId,
            // ... some more properties of t2
        }).FirstOrDefault(),
    // ... some more properties of t1
});

TableOne.FirstTableTwoReference.Invoke(t1)定义

public static Expression> FirstTableTwoReference => (t1) => t1.TableTwoReferences.FirstOrDefault();

目前,我有以下动态构建TableOne-part:

public Expression> Init(TableOneConfig cfg)
{
    var memberBindings = new List();
    var selectType = typeof(TableOneSelect);
    var newExpression = Expression.New(selectType);
    var theEntity = Expression.Parameter(typeof(TableOne), "t1");

    // decide if the property is needed and add to the object-initializer
    if (cfg.Select("TableOneId"))
        memberBindings.Add(Expression.Bind(selectType.GetProperty("TableOneId"), Expression.Property(theEntity, nameof("TableOneId"))));

    // ... check other properties of TableOneSelect depending on given config

    var memberInit = Expression.MemberInit(newExpression, memberBindings);
    return Expression.Lambda>(memberInit, theEntity);
}

为相同TableTwo(不同的性质和不同的DB-表).

我可以像这样动态调用

dbContext.TableOne.Select(t => TableOneHelper.Init(cfg).Invoke(t1));

Invoke来自LinqKit.

但是我对内部部分感到困惑,TableOneTableTwoReference因为我需要在其中进行枚举来调用它Init,TableTwoHelper但我不明白这是如何实现的.

我想Expression.NewArrayInit(typeof(TableTwo), ...)这将是第一步.但我仍然陷入如何传递t1.TableTwoReferences.FirstOrDefault()给这个调用Selecton的数组.


推荐阅读
author-avatar
捕风的水中龙_106
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有