【问题标题】:WhereNot linq expressionWhereNot linq 表达式
【发布时间】:2010-02-15 04:33:02
【问题描述】:

我正在尝试创建一个扩展“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

不知道怎么切换boolean flag,函数Negate会做吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    这意味着它从 IQueryable 调用将返回 IEnumerable&lt;T&gt;,而不是 IQueryable&lt;T&gt;。这会强制表达式编译,并可能导致对 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());
        }
    }
    

    【讨论】:

      【解决方案2】:

      是的,像这样的 Negate 方法会帮助你:

      Public Function Negate(Of T)(ByVal predicate As Func(Of T, Boolean)) As Func(Of T, Boolean)
         Return Function(x) Not predicate(x)
      End Function
      

      然后像这样使用它:

      Dim x = "Hello world "
      Dim y = x.Split.Where(Negate(Of String)(AddressOf String.IsNullOrEmpty))
      

      或者使用这样的 WhereNot() 方法:

      <Extension> _
      Public Shared Function WhereNot(Of T)(ByVal source As IEnumerable(Of T), ByVal predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
          Return source.Where(Negate(predicate))
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 2020-08-11
        相关资源
        最近更新 更多