【问题标题】:List<object>.Contains Expression TreeList<object>.Contains 表达式树
【发布时间】:2021-12-28 07:06:45
【问题描述】:

我想构建一个等同于预期的表达式...

Expression<Func<ReferencedEntity, bool>> expected = (ReferencedEntity referencedEntity) => foreignKeys.Contains(referencedEntity.Id);
Expression<Func<ReferencedEntity, bool>> actual;

foreignKeys 类型是List&lt;object&gt;

这是我目前所拥有的,我认为它会使用 Expression.Call() 方法,但不确定如何去做。

ParameterExpression entityParameter = Expression.Parameter(typeof(TReferencedEntity), "referencedEntity");
MemberExpression memberExpression = Expression.Property(entityParameter, "Id");
Expression convertExpression = Expression.Convert(memberExpression, typeof(object)); //This is becuase the memberExpression for Id returns a int.

//Expression containsExpression = Expression.Call(????

//actual = Expression.Lambda<Func<TReferencedEntity, bool>>(????, entityParameter);

感谢您的帮助。

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    如果没有塞缪尔的建议,这是我无法完成的解决方案......

        /// <summary>
        /// 
        /// </summary>
        /// <param name="foreignKeys"></param>
        /// <returns></returns>
        private Expression<Func<TReferencedEntity, bool>> BuildForeignKeysContainsPredicate(List<object> foreignKeys, string primaryKey)
        {
            Expression<Func<TReferencedEntity, bool>> result = default(Expression<Func<TReferencedEntity, bool>>);
    
            try
            {
                ParameterExpression entityParameter = Expression.Parameter(typeof(TReferencedEntity), "referencedEntity");
                ConstantExpression foreignKeysParameter = Expression.Constant(foreignKeys, typeof(List<object>));
                MemberExpression memberExpression = Expression.Property(entityParameter, primaryKey);
                Expression convertExpression = Expression.Convert(memberExpression, typeof(object));
                MethodCallExpression containsExpression = Expression.Call(foreignKeysParameter
                    , "Contains", new Type[] { }, convertExpression);
    
                result = Expression.Lambda<Func<TReferencedEntity, bool>>(containsExpression, entityParameter);
    
            }
            catch (Exception ex)
            {
                throw ex;
            }
    
            return result;
        }
    

    【讨论】:

      【解决方案2】:

      我不知道解决方案,但我知道您如何获得它。创建一个接受 Expression&lt;Func&lt;ReferencedEntity, bool&gt;&gt; 的虚拟函数并将其传递给您的 lambda。并且使用调试器,您可以检查编译器如何为您创建表达式。

      【讨论】:

      • 让我更进一步......谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多