1

我试图总结一些重复的代码扩展方法,清理了一点东西。LINQ表达式与LINQ到实体

我试图避免被检查,如果一个字符串(通常是一个控件的文本值)为空/空,如果是,它使用比较模式包含在我的数据的字段。显然这个字段并不是硬编码到我的扩展中,对象类型也不是。我得到的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数据库运行这个真的,因为它是过滤的结果,所以我不想那样做在内存中。任何任何想法?

回答

2

LINQ到实体不知道如何调用一个代表,它需要一个表达摸出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指定的字段,那么关键的检查,每个组中的项目返回。

+0

+1。聪明的想法。 – StriplingWarrior 2012-02-28 21:50:02

+0

尽管如此,在一百万年内!作品魅力,不错! – RichardW1001 2012-02-28 22:22:40