使用反射进行可查询的联接

问题描述

我正在尝试加入两个IQueryable。
第一个是TSource类型(唯一可以确定的类型,它具有Guid Id属性),它表示系统上的任何实体。该可查询对象用于多个事务表。它可以正常工作,用于根据来自视图的GridFilters / GridSorts在视图上过滤/排序我的网格。
第二个是IQueryable,使用一个具体的类,其中包含属性TransactionId(类型Guid),另一个类称为ValueName和Value(为简单起见)。它表示TSource上的先前ID。该类旨在将其他字段添加到先前的实体。它可以独立运行,可以从GridFilters / GridSorts中读取配置。

到目前为止,我的加入是

public IQueryable<TSource> JoinAdditionalField<TSource>(IQueryable<TSource> source,IQueryable<TransactionValue> queryTransactionValue)
        {
            var typeSource = typeof(TSource);
            LambdaExpression sourceKeyExpression = GetPropertyAccesssLambdaExpr(typeSource,"Id");
            LambdaExpression additionalFieldKeyExpression = GetPropertyAccesssLambdaExpr(typeof(TransactionValue),"TransactionId");
            //var resultExpression1 = (query1,query2) => new {query1};  // Only if returning source data
            //var resultExpression2 = (query1,query2) => new {query1,query2};
            MethodInfo joinMethod = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public).
                First(m => m.Name == "Join" && m.GetParameters().Length == 5);
            var genericJoinMethod = joinMethod.MakeGenericMethod(typeSource,typeof(TransactionValue),typeof(Guid),typeSource);
            var joined = genericJoinMethod.Invoke(source,new object[]
            {
                source,queryTransactionValue,sourceKeyExpression,additionalFieldKeyExpression,resultExpression 
            });

            return source;
        }


        private LambdaExpression GetPropertyAccesssLambdaExpr(Type type,string name)
        {
            PropertyInfo prop = type.GetProperty(name,BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
            ParameterExpression param = Expression.Parameter(type);
            MemberExpression propAccess = Expression.Property(param,prop.Name);
            LambdaExpression expr = Expression.Lambda(propAccess,param);
            return expr;
        }

我现在的问题是如何定义resultExpression。
第一步,我只想返回TSource(resultExpression1)中的字段,但要有效地连接两个表。这是因为执行查询后,我的先前代码已经在以后的步骤中填充了我的viewModel(包含TransactionValue和TSource的属性)。

之后,我们的任务是映射一个resultExpression2,这样
TransactionX
ID:A220B4CD-1C5A-4C51-9BF5-5BE43BE3B1F6
栏位1:1
Field2:“嗨”

TransactionValue
ID:
TransactionId:A220B4CD-1C5A-4C51-9BF5-5BE43BE3B1F6
ValueName:“国家/地区”
值:“西班牙”

TransactionXViewModel,在网格中使用
ID:A220B4CD-1C5A-4C51-9BF5-5BE43BE3B1F6
栏位1:1
Field2:“嗨”
国家/地区:“西班牙”

总而言之,如果解决resultExpression1,我想我现在可以接受。 对于resultExpression2,我仍然需要更好地思考如何以通用方式(即通过反射)将附加值分配给VM。

预先感谢您的想法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...