.net - WhereNot linq 表达式

标签 .net linq expression expression-trees linq-expressions

我正在尝试创建一个扩展“WhereNot”

所以我可以使用:

Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)

请注意,我的目标是学习 linq 表达式;没有解决我的问题。

我创建了这个函数:

 <Extension()> _
 Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
  Return source.Where(GetWhereNotExpression(selector))
 End Function

我不知道如何切换 bool 标志,函数 Negate 可以做到吗?

欢迎使用 vb.net 和 C# 的答案

最佳答案

我意识到这是一个非常古老的已回答问题,但我认为所选答案具有误导性,因为提问者正在寻找表达式,而所选答案提供了 lambda。

这意味着从 IQueryable 调用将返回 IEnumerable<T> ,不是 IQueryable<T> 。这会强制表达式进行编译,并可能导致对 Linq 提供程序的访问优化不佳。

这是直接解决原始问题的答案。

public static class NegationExpressionHelper
{
    public static IQueryable<T> WhereNot<T>(this IQueryable<T> queryable, Expression<Func<T,bool>> predicate)
    {
        return queryable.Where(predicate.Invert());
    }
    public static Expression<Func<T, bool>> Invert<T>(this Expression<Func<T, bool>> original)
    {
        return Expression.Lambda<Func<T, bool>>(Expression.Not(original.Body), original.Parameters.Single());
    }
}

关于.net - WhereNot linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2264050/

相关文章:

C# XMLDocument 到 DataTable?

c# - 如何使用反射和 LINQ to Entities 来获取实体属性的值?

haskell - 绝望 : How to install Haskell School of Expression graphics pkg, Windows XP 和 7

java - Web 服务自定义绑定(bind) - 签署 SOAP header 和消息,但不加密

.net - 存储过程中的表值参数获取执行权限被拒绝错误

C# Ftp 错误 (552) 超出存储分配

java - Android 上的最佳方式或类似的 lambda 表达式或 linq(eclipse)

c# - 添加条件以将 linq 加入对象 c#

Java Play Ebean - 如何使用表达式 Expr.Or() 或类似的

javascript - 一切都是表达