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);
}
}