Vb.net 具有Linq to实体的Linq表达式

Vb.net 具有Linq to实体的Linq表达式,vb.net,linq,entity-framework,linq-to-entities,linq-expressions,Vb.net,Linq,Entity Framework,Linq To Entities,Linq Expressions,我试图用一种扩展方法来包装一些重复的代码,以便稍微清理一下 我试图避免的模式是检查字符串(通常是控件的文本值)是否为null/空,如果为null/空,则使用Contains将其与数据中的字段进行比较。显然,字段没有硬编码到我的扩展中,对象类型也没有 我所得到的在Linq to对象中非常有效,但我得到的一般运行时错误Linq to Entities无法识别方法“System.String InvokeGenericQueryHelper.Customer”方法,并且该方法无法转换为存储表达式。当使

我试图用一种扩展方法来包装一些重复的代码,以便稍微清理一下

我试图避免的模式是检查字符串(通常是控件的文本值)是否为null/空,如果为null/空,则使用Contains将其与数据中的字段进行比较。显然,字段没有硬编码到我的扩展中,对象类型也没有

我所得到的在Linq to对象中非常有效,但我得到的一般运行时错误Linq to Entities无法识别方法“System.String InvokeGenericQueryHelper.Customer”方法,并且该方法无法转换为存储表达式。当使用实体框架模型时

以下是我所拥有的:

<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String)
    If String.IsNullOrEmpty(compareTo) Then
        Return source
    Else
        Dim compiledField As System.Func(Of T, String) = expressionField.Compile()
        Return source.Where(Function(x) compiledField.Invoke(x).Contains(compareTo))
    End If
End Function

我确实需要让它在SQL数据库上运行,因为它正在过滤结果,所以我不想在内存中这样做。有人有什么想法吗?

是的,这是可能的,但它涉及操纵。您可以自己执行,也可以让他人为您执行树遍历。

是的,这是可能的,但它涉及到操作。您可以自己执行,也可以让您执行树遍历。

Linq to entities不了解如何调用委托,它需要一个表达式来计算要生成的SQL

以下内容可能会满足您的要求:

<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String)
    If String.IsNullOrEmpty(compareTo) Then
        Return source
    Else
        Return source.GroupBy(expressionField)
            .Where(Function(g) g.Key.Contains(compareTo))
            .SelectMany(Function(g) g)
    End If
End Function

GroupBy用于选择expressionField指定的字段,然后检查键,并返回每个组中的项。

Linq to entities不了解如何调用委托,它需要一个表达式来计算要生成的SQL

以下内容可能会满足您的要求:

<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String)
    If String.IsNullOrEmpty(compareTo) Then
        Return source
    Else
        Return source.GroupBy(expressionField)
            .Where(Function(g) g.Key.Contains(compareTo))
            .SelectMany(Function(g) g)
    End If
End Function

GroupBy用于选择expressionField指定的字段,然后检查键,然后返回每个组中的项目。

在一百万年内都不会想到这一点!很有魅力,不错!在一百万年内永远不会想到这一点!很有魅力,不错!一些好的阅读材料,谢谢!你可能刚刚回答了一大堆未来的问题!一些好的阅读材料,谢谢!你可能刚刚回答了一大堆未来的问题!
<System.Runtime.CompilerServices.Extension()>
Public Function CompareAndFilter(Of T)(source As System.Linq.IQueryable(Of T), expressionField As System.Linq.Expressions.Expression(Of System.Func(Of T, String)), compareTo As String)
    If String.IsNullOrEmpty(compareTo) Then
        Return source
    Else
        Return source.GroupBy(expressionField)
            .Where(Function(g) g.Key.Contains(compareTo))
            .SelectMany(Function(g) g)
    End If
End Function