【发布时间】: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