带反射错误的Linq:表达式Linq';调用&x27;LINQ to实体中不支持节点
我在处理lambda表达式时遇到问题。我正在EF下使用MVC,我试图创建一个“元模型”,每个模型都将继承它,并使用它创建一个使用Linq列出元素的方法 因为这是一个“元模型”,我不知道类的定义 我正在尝试这样做,假设我们有一个模型类“Customer” 但是我希望它是泛型的,所以我传递了一个继承类的属性名,并且我希望能够根据这个属性进行搜索(和排序) 这是我最好的方法:带反射错误的Linq:表达式Linq';调用&x27;LINQ to实体中不支持节点,linq,expression-trees,lambda,Linq,Expression Trees,Lambda,我在处理lambda表达式时遇到问题。我正在EF下使用MVC,我试图创建一个“元模型”,每个模型都将继承它,并使用它创建一个使用Linq列出元素的方法 因为这是一个“元模型”,我不知道类的定义 我正在尝试这样做,假设我们有一个模型类“Customer” 但是我希望它是泛型的,所以我传递了一个继承类的属性名,并且我希望能够根据这个属性进行搜索(和排序) 这是我最好的方法: Public MustInherit Class BaseBL Public Function AutoLi
Public MustInherit Class BaseBL
Public Function AutoList(Of T)(conf As ConfigurationBL) As List(Of T)
Dim items As List(Of T)
Dim sortParam = Expression.Parameter(GetType(T), "param")
Dim sortFunc = Expression.Convert(Expression.Property(sortParam, conf.SortField), GetType(Object))
Dim sortExpr = Expression.Lambda(Of Func(Of T, Object))(sortFunc, sortParam).Compile()
Dim searchFunc As Func(Of T, Boolean) = Function(param)
Dim prInfo As PropertyInfo = param.GetType.GetProperty(conf.SearchField)
Dim str As String = prInfo.GetValue(param, Nothing)
Return str.Contains(conf.SearchText)
End Function
Dim searchExpr As Expression(Of Func(Of T, Boolean)) = Function(param) searchFunc(param)
Dim query As IQueryable(Of T) = GetQueryable(Of T)()
items = query.Where(searchExpr).OrderBy(sortExpr).ToList() '.Skip(conf.PageSize * (conf.PageNumber - 1)).Take(conf.PageSize).ToList()
Return items
End Function
Public MustOverride Function GetQueryable(Of T)() As IQueryable(Of T)
End Class
该类是泛型类T的父类,因此getQuerable(of T)方法将在子类上实现
ConfigurationBL类包含sortField、searchField和searchText,它们将提供正确的配置
这几乎奏效了。我用sortExpr执行orderBy,它可以工作,如果我用searchExpr执行where,它也可以工作
当我试着一起做所有的事情时,问题就来了。它提出了一个例外:
“LINQ to实体中不支持表达式LINQ‘Invoke’节点”
我很确定这是因为我使用
Dim searchExpr As Expression(Of Func(Of T, Boolean)) = Function(param) searchFunc(param)
而不是正确的表达式树,但我不知道如何将searchFunc转换为表达式树
我真的很坚持这一点,我真的非常感谢任何帮助和想法,谢谢:)最后我能够自己修复它,我用这个替换了searchExpr
Dim searchExpr = getSearchExpression(Of T)(conf.SearchField, conf.SearchText).Compile()
在哪里
Private Function getSearchExpression(Of T)(propName As String, search As String) As Expression(Of Func(Of T, Boolean))
Dim element As ParameterExpression = Expression.Parameter(GetType(T), "element")
Dim propertyValue As ParameterExpression = Expression.Variable(GetType(String), "propertyValue")
Dim searchText As ParameterExpression = Expression.Variable(GetType(String), "searchText")
Dim asgPropertyValue As Expression = Expression.Assign(propertyValue,
Expression.Convert(Expression.Property(element, propName), GetType(String))
)
Dim asgSearchText As Expression = Expression.Assign(searchText,
Expression.Constant(search)
)
Dim callContains As Expression = Expression.Call(propertyValue, GetType(String).GetMethod("Contains"), searchText)
Dim block As Expression = Expression.Block(GetType(Boolean),
New List(Of ParameterExpression)({propertyValue, searchText}),
asgPropertyValue,
asgSearchText,
callContains
)
Return Expression.Lambda(Of Func(Of T, Boolean))(block, element)
End Function
我希望这可以帮助一些人,问候:)
Private Function getSearchExpression(Of T)(propName As String, search As String) As Expression(Of Func(Of T, Boolean))
Dim element As ParameterExpression = Expression.Parameter(GetType(T), "element")
Dim propertyValue As ParameterExpression = Expression.Variable(GetType(String), "propertyValue")
Dim searchText As ParameterExpression = Expression.Variable(GetType(String), "searchText")
Dim asgPropertyValue As Expression = Expression.Assign(propertyValue,
Expression.Convert(Expression.Property(element, propName), GetType(String))
)
Dim asgSearchText As Expression = Expression.Assign(searchText,
Expression.Constant(search)
)
Dim callContains As Expression = Expression.Call(propertyValue, GetType(String).GetMethod("Contains"), searchText)
Dim block As Expression = Expression.Block(GetType(Boolean),
New List(Of ParameterExpression)({propertyValue, searchText}),
asgPropertyValue,
asgSearchText,
callContains
)
Return Expression.Lambda(Of Func(Of T, Boolean))(block, element)
End Function