其中没有linq表达式 [英] WhereNot linq expression

查看:179
本文介绍了其中没有linq表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to create an extension "WhereNot"

所以我可以使用:

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

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

Note that my aim here is to learn linq expressions; not solve my issue.

我讨论了这个功能:

 <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

我不知道如何切换布尔标志,函数Negate会做吗?

I don't know how to switch the boolean flag, will the function Negate do it?

在vb.net和C#中的答案都受欢迎

answers in both vb.net and C# are welcommed

推荐答案

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

I realize this is a very old answered question, but I think the selected answer is misleading, because the asker was looking for an expression, and the selected answer provides a lambda.

这意味着它从IQueryable的调用将返回一个 IEnumerable< T> ,而不是一个 IQueryable ; T> 。这迫使表达式进行编译,并且可能导致对Linq提供商的访问权限不足。

This means that its invocation from an IQueryable will return an IEnumerable<T>, not an IQueryable<T>. This forces the expression to compile, and can lead to poorly optimized access to Linq providers.

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

Here is an answer that directly addresses the original question.

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());
    }
}

这篇关于其中没有linq表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆