List<object>.Contains 表达式树

Posted

技术标签:

【中文标题】List<object>.Contains 表达式树【英文标题】:List<object>.Contains Expression Tree 【发布时间】: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);

感谢您的帮助。

【问题讨论】:

【参考方案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。并且使用调试器,您可以检查编译器如何为您创建表达式。

【讨论】:

让我更进一步......谢谢

以上是关于List<object>.Contains 表达式树的主要内容,如果未能解决你的问题,请参考以下文章

将 List<Object> 转换为 ObservableCollection<Object> 的最佳方法

展平 List<Tuple<string,List<Object>>> [重复]

把java两个list <object>集合 放到第三个list<object>集合中去

java List<Object[]> 如何数据去重

java 一个方法返回了一个list,怎么将这个list转成List<List<Object>>

为啥我不能从 List<MyClass> 转换为 List<object>?