C# 其中具有动态特性

C# 其中具有动态特性,c#,linq,C#,Linq,我想构建LINQ,它稍后将被翻译成sql中的WHERE IN。在常规用例中,我将执行以下操作: (queryable是iqualable和arr是IEnumerable) 但是 我的问题是,我要筛选的值(e.Id)是动态的,我将其作为字符串获取。我该怎么做 更多背景: 我正在做REST API端点,用户可以通过它发送要筛选值的列,因此示例如下: filter:{“id”:[1,2]} 我想将其转换为类似queryable.Where(e=>new[]{1,2}.Contains(e.Id)) f

我想构建
LINQ
,它稍后将被翻译成
sql
中的
WHERE IN
。在常规用例中,我将执行以下操作:

queryable
iqualable
arr
IEnumerable

但是

我的问题是,我要筛选的值(
e.Id
)是动态的,我将其作为字符串获取。我该怎么做

更多背景: 我正在做REST API端点,用户可以通过它发送要筛选值的列,因此示例如下:

  • filter:{“id”:[1,2]}
  • 我想将其转换为类似
    queryable.Where(e=>new[]{1,2}.Contains(e.Id))

  • filter:{“customerId”:[4,5]}
  • 我想将其转换为类似于
    queryable.Where(e=>new[]{4,5}.Contains(e.CustomerId))

    因此,基本上我的输入是一个列名称,它是一个
    字符串
    ,ID列表是
    IEnumerable


    我觉得可以通过使用
    表达式
    (类似于)来实现,但我不知道如何实现。

    您可以这样做:

    public static class QueryableExtensions {
        public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> query, string property, IEnumerable<TValue> values) {
            // x
            var arg = Expression.Parameter(typeof(TEntity), "x");
            // x.Property            
            var prop = Expression.Property(arg, property);
            // values.Contains(x.Property)
            var contains = Expression.Call(
                typeof(Enumerable),
                "Contains",
                new[] { typeof(TValue) },
                Expression.Constant(values),
                prop
            );
            // x => values.Contains(x.Property)
            var lambda = Expression.Lambda<Func<TEntity, bool>>(contains, arg);
            return query.Where(lambda);
        }
    }
    
    公共静态类QueryableExtensions{
    公共静态IQueryable,其中(此IQueryable查询、字符串属性、IEnumerable值){
    //x
    var arg=表达式参数(typeof(tenty),“x”);
    //十、财产
    var prop=Expression.Property(arg,Property);
    //值。包含(x.Property)
    var contains=Expression.Call(
    类型(可枚举),
    “包含”,
    新[]{typeof(TValue)},
    表达式。常量(值),
    道具
    );
    //x=>values.Contains(x.Property)
    var lambda=Expression.lambda(contains,arg);
    返回查询.Where(lambda);
    }
    }
    

    请注意,您传递的枚举中的值的类型和属性类型应该匹配,这样才能起作用(因此,如果属性的类型为int-传递int数组)。

    我猜这就是您要寻找的,但是使用参数化属性名称。完美!谢谢
    public static class QueryableExtensions {
        public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> query, string property, IEnumerable<TValue> values) {
            // x
            var arg = Expression.Parameter(typeof(TEntity), "x");
            // x.Property            
            var prop = Expression.Property(arg, property);
            // values.Contains(x.Property)
            var contains = Expression.Call(
                typeof(Enumerable),
                "Contains",
                new[] { typeof(TValue) },
                Expression.Constant(values),
                prop
            );
            // x => values.Contains(x.Property)
            var lambda = Expression.Lambda<Func<TEntity, bool>>(contains, arg);
            return query.Where(lambda);
        }
    }