c# - 动态 Linq 查询包含列表

标签 c# linq dynamic arraylist contains

我正在使用动态 Linq 进行一般搜索。 我有 ID 列表:

List<int> idList = new List<int> { 1, 5, 6};

在普通的 Linq 中,我会写:

q = q.Where(a => idList.Contains(a.MyId));

但现在我必须使用 System.Linq.Dynamic 因为我事先不知道列的名称。

string someId = "CustomId";
q = q.Where("@0"+ ".Contains(" + someId + ")", idList.ToArray());

但这给出了错误:

"No applicable method 'Contains' exists in type 'Int32'"

我怎样才能做到这一点?

是否有一些扩展库为 dynamic Linq 或其他方式实现了 Contains

最佳答案

你可以写这样的东西来动态构建你的查询函数:

public static Func<ObjT, bool> PropertyCheck<ObjT, PropT>(string propertyName, Expression<Func<PropT, bool>> predicate)
{
    var paramExpr = Expression.Parameter(typeof(ObjT));
    var propExpr = Expression.Property(paramExpr, propertyName);
    return Expression.Lambda<Func<ObjT, bool>>(Expression.Invoke(predicate, propExpr), paramExpr).Compile();
}

然后,它可以像这样使用:

foos.Where(PropertyCheck<Foo, int>("MyId", x => idList.Contains(x)));

当然,您也可以只提供自己的Where 扩展方法来一次完成所有这些:

public static IEnumerable<T> Where<T, PropT>(this IEnumerable<T> self, string propertyName, Expression<Func<PropT, bool>> predicate)
{
    var paramExpr = Expression.Parameter(typeof(T));
    var propExpr = Expression.Property(paramExpr, propertyName);
    return self.Where<T>(Expression.Lambda<Func<T, bool>>(Expression.Invoke(predicate, propExpr), paramExpr).Compile());
}
foos.Where<Foo, int>("MyId", x => idList.Contains(x));

关于c# - 动态 Linq 查询包含列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22913540/

相关文章:

c# - 从 C# 中生成的搜索结果中选择一个随机链接

c# - 通过使用 xpath 在 c# 中过滤现有文档来创建新的 XMLDocument

c# - 从将动态参数作为输入的 lambda 中获取属性名称

c# - 在 LINQ 中查找重叠兴趣

c# - 需要有关二进制 plist 的帮助

c# - ASP.NET 页面上的 Google Analytics 信息

javascript - 有没有办法获取调用函数的数组元素的键值?

c# - 如何从后台工作线程更改 XAML 元素?

c# - Linq - 通过求和计算进行分组

python - 动态调用方法(如果 Django 中存在)