动态 Linq 查询包含列表

bor*_*sdj 7 c# linq contains arraylist dynamic

我正在使用动态 Linq 进行通用搜索。我有 Id 列表:

List<int> idList = new List<int> { 1, 5, 6};
Run Code Online (Sandbox Code Playgroud)

在普通的 Linq 中,我会写:

q = q.Where(a => idList.Contains(a.MyId));
Run Code Online (Sandbox Code Playgroud)

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

string someId = "CustomId";
q = q.Where("@0"+ ".Contains(" + someId + ")", idList.ToArray());
Run Code Online (Sandbox Code Playgroud)

但这给出了错误:

“'Int32' 类型中不存在适用的方法 'Contains'”

我怎样才能做到这一点?

是否有一些ContainsdynamicLinq 或其他方式实现的扩展库。

pok*_*oke 6

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

foos.Where(PropertyCheck<Foo, int>("MyId", x => idList.Contains(x)));
Run Code Online (Sandbox Code Playgroud)

当然,您也可以提供自己的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());
}
Run Code Online (Sandbox Code Playgroud)
foos.Where<Foo, int>("MyId", x => idList.Contains(x));
Run Code Online (Sandbox Code Playgroud)