gpt4 book ai didi

c# - 如何删除或覆盖现有 IQueryable 中的 where 子句

转载 作者:行者123 更新时间:2023-11-30 16:43:15 24 4
gpt4 key购买 nike

假设以下预过滤 IQueryable:

var query = items.Where(i => i.PropertyName == "Some property");

来自第三方库,是否可以完全删除 Where 子句,或将其替换为:

.Where(i => i.PropertyName == null || i.PropertyName == "Some property")

我看到有人提到能够即时重写 IQueryable。这种方法会有什么缺点吗?我会怎么做呢?有没有更好的办法?

更新

我已经按照 Ivan 的建议使用 ExpressionVisitor 拼凑了一些东西:

public class WhereRemoveVisitor : ExpressionVisitor
{
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if (node.Method.Name == "Where" && node.Method.DeclaringType == typeof(Queryable))
return node.Arguments[0];
else
return base.VisitMethodCall(node);
}
}

和:

public static class IQueryableExtensions
{
public static IQueryable<T> RemoveWhere<T>(this IQueryable<T> expression)
{
return Expression.Lambda<IQueryable<T>>(new WhereRemoveVisitor().Visit(expression.Expression)).Compile();
}
}

虽然编译正常,但它在扩展方法中抛出“Lambda 类型参数必须派生自 System.Delegate”。

最佳答案

我已经按照 Ivan 的建议使用 ExpressionVisitor 将一些东西放在一起:

public class WhereRemoveVisitor : ExpressionVisitor
{
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if (node.Method.Name == "Where" && node.Method.DeclaringType == typeof(Queryable))
return node.Arguments[0];
else
return base.VisitMethodCall(node);
}
}

和:

public static class IQueryableExtensions
{
public static IQueryable<T> RemoveWhere<T>(this IQueryable<T> expression)
{
var delExpr = Expression.Lambda<Func<IQueryable<T>>>(new WhereRemoveVisitor().Visit(expression.Expression)).Compile();
return delExpr();
}
}

关于c# - 如何删除或覆盖现有 IQueryable 中的 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45308746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com