【问题标题】:Linq expressions with Linq to Entities带有 Linq to Entity 的 Linq 表达式
【发布时间】:2012-02-28 21:09:36
【问题描述】:

我正在尝试在扩展方法中包装一些重复的代码,以便稍微清理一下。

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

我在 Linq to Objects 中完美运行,但我得到通用运行时错误“LINQ to Entities 无法识别方法 'System.String Invoke(GenericQueryHelper.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

我也试过了:

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

结果相同...

首先,这可能吗?我希望我的用法看起来像这样:

Dim results = repository.Customers.CompareAndFilter(Function(c) c.FirstName, searchText)

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

【问题讨论】:

    标签: vb.net linq entity-framework linq-to-entities linq-expressions


    【解决方案1】:

    是的,这是可能的,但它涉及expression 操作。您可以自己parse the expression you're given and build the new criterion expression,也可以让LINQKit 为您执行树遍历。

    【讨论】:

    • 一些很好的阅读材料,谢谢!您可能刚刚回答了一大堆未来的问题!
    【解决方案2】:

    Linq to entity 不知道如何调用委托,它需要一个表达式来计算出要生成的 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指定的字段,然后检查key,返回每个组中的项目。

    【讨论】:

    • 一百万年里绝对不会有这种事!很有魅力,不错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多