尝试对IQueryable进行排序时出错 [英] Error trying to sort IQueryable
问题描述
我正在尝试对IQueryable动态排序。
Dim activities = From in db.VW_ActivitiesSelect a
activities = activities.OrderBy(Function(a)New ActivityComparer(SortFields(0).Sort))
SortFields的定义:
公开SortFields()As List(OfSortField)
Class Sortfield有3个属性:
Public Property Column()As String
Public Property Type()As Type
Public Property Sort()As SortOrder
类ActivityComparer的定义
PrivateClass ActivityComparer
Implements System.Collections.IComparer
Private sortOrderModifier为整数= 1个
 公共SubNew(BYVAL sortOrderAs System.Windows.Forms.SortOrder)
 如果中将sortOrder = System.Windows.Forms.SortOrder.DescendingThen
  sortOrderModifier = -1
  elseif的中将sortOrder = System.Windows.Forms.SortOrder.AscendingThen
  sortOrderModifier = 1
结束如果
End Sub
公共函数CompareActivity(xAs Object,y As Object)AsInteger _
 用工具System.Collections.IComparer.Compare
 昏暗a1As VW_Activitie = CTYPE(X,VW_Activitie)
 昏暗A2作为VW_Activitie = CTYPE (y,VW_Activitie)
Dim CompareResultAs Integer = 0
对于nIndex = 0 To SortFields.Count - 1
如果CompareResult = 0 AndAlso SortFields.Cou nt> = nIndex + 1然后
CompareResult = GetActivityCompareResult(a1,a2,SortFields.Item(nIndex))
Else
退出为
结束如果
下一个
返回CompareResult * sortOrderModifier
 结束函数
 公共功能GetActivityCompareResult(为ByRef a1As VW_Activitie,A2的ByRef作为VW_Activitie,为ByRef SF作为的SortField)作为整数
 昏暗Cr作为整数= 0
Dim colProp AsPropertyInfo()= a1。[GetType]()。GetProperties()
For Each propInfoAs PropertyInfoIn colProp
如果propInfo.Name = sf.Column则为
Dim act1 AsObject = propInfo.GetValue(a1,Nothing)
Dim act2 AsObject = propInfo。 GetValue(a2,Nothing)
SelectCase sf.Type
Case GetType(System.String)
cr = System .String.Compare(act1.ToString(),act2.ToString())
Case GetType(System.DateTime)
cr = System.DateTime.Compare(CDate(act1),CDate(act2))
Case GetType(System.Int64)
Dim n1 As Int64 = CLng(act1)
Dim n2 As Int64 = CLng(act2)
如果n1< n2然后
cr = -1
ElseIf n1 = n2然后
cr = 0
否则
cr = 1
结束如果
Case GetType(System.Decimal)
Dim n1 As Decimal = CDec(act1)
Dim n2 As Decimal = CDec(act2)
if n1< n2然后
cr = -1
ElseIf n1 = n2然后
cr = 0
否则
cr = 1
结束如果
结束选择
结束如果
下一个
返回cr
结束功能
EndClass
我在调试时看到Locals窗口中的错误,或者在需要根据IQueryable活动显示报告作为数据源的报表查看器中看到错误。
的不能为了通过&lsquo的; MyNameSpace.FrmActivities + ActivityComparer&rsquo的;
在为了评估索引属性,必须对该属性进行限定,并且必须由用户显式提供参数。
此错误消息的含义是什么?
谢谢
Ruwel
  ;
我在VB中使用Linq提供通用排序器的代码:
Imports System.Linq.Expressions
Public Class GenericListSorter(Of T)
Public Function SortAscending( ByVal source 作为 IEnumerable(Of T), ByVal sortBy As String ) As IEnumerable(Of T)
Dim param = Expression.Parameter( GetType (T)," item" )
Dim sortExpression = Expression.Lambda(Of Func(Of T, Object ))(Expression.Convert(Expression。[ Property ](param,sortBy), GetType ( Object )),param)
Dim IQue As IQueryable(Of T)= source.AsQueryable
Dim IRet 作为 IQueryable(Of T)=(IQue.OrderBy(Of Object )(sortExpression))
返回 IRet
End 功能
公共 功能 SortDescending( ByVal source As IEnumerable(Of T), ByVal sortBy As String )作为 IEnumerable(Of T)
Dim param = Expression.Parameter( GetType (T)," item" )
Dim sortExpression = Expression.Lambda(Of Func(Of T, Object ))(Expression.Convert(Expression。[属性](param,sortBy), GetType ( Object )),param )
Dim IQue As IQueryable(Of T)= source。 AsQueryable
Dim IRet As IQueryable(Of T)=(IQue.OrderByDescending(Of Object )(sortExpression))
返回 IRet
结束 功能
结束 Class
Hi,
I’m trying to sort a IQueryable dynamicaly.
Dim activities =From a In db.VW_ActivitiesSelect a
activities = activities.OrderBy(Function(a)New ActivityComparer(SortFields(0).Sort))definition of SortFields:
Public SortFields()As List(OfSortField)
Class Sortfield has 3 properties:
Public Property Column()As String
Public Property Type()As Type
Public Property Sort()As SortOrderDefinition of class ActivityComparer
PrivateClass ActivityComparer
Implements System.Collections.IComparer
Private sortOrderModifier As Integer = 1
Public SubNew(ByVal sortOrderAs System.Windows.Forms.SortOrder)
If sortOrder = System.Windows.Forms.SortOrder.DescendingThen
sortOrderModifier = -1
ElseIf sortOrder = System.Windows.Forms.SortOrder.AscendingThen
sortOrderModifier = 1
End If
End Sub
Public Function CompareActivity(xAs Object, y As Object) AsInteger _
Implements System.Collections.IComparer.Compare
Dim a1As VW_Activitie =CType(x, VW_Activitie)
Dim a2 As VW_Activitie = CType(y, VW_Activitie)
Dim CompareResultAs Integer = 0
For nIndex = 0 To SortFields.Count - 1
If CompareResult = 0 AndAlso SortFields.Count >= nIndex + 1 Then
CompareResult = GetActivityCompareResult(a1, a2, SortFields.Item(nIndex))
Else
Exit For
End If
Next
Return CompareResult * sortOrderModifier
End Function
Public Function GetActivityCompareResult(ByRef a1As VW_Activitie,ByRef a2 As VW_Activitie, ByRef sf As SortField) As Integer
Dim cr As Integer = 0
Dim colProp AsPropertyInfo() = a1.[GetType]().GetProperties()
For Each propInfoAs PropertyInfoIn colProp
If propInfo.Name = sf.Column Then
Dim act1 AsObject = propInfo.GetValue(a1, Nothing)
Dim act2 AsObject = propInfo.GetValue(a2, Nothing)
SelectCase sf.Type
Case GetType(System.String)
cr = System.String.Compare(act1.ToString(), act2.ToString())
Case GetType(System.DateTime)
cr = System.DateTime.Compare(CDate(act1),CDate(act2))
Case GetType(System.Int64)
Dim n1 As Int64 = CLng(act1)
Dim n2 As Int64 = CLng(act2)
If n1 < n2 Then
cr = -1
ElseIf n1 = n2 Then
cr = 0
Else
cr = 1
End If
Case GetType(System.Decimal)
Dim n1 As Decimal = CDec(act1)
Dim n2 As Decimal = CDec(act2)
If n1 < n2 Then
cr = -1
ElseIf n1 = n2 Then
cr = 0
Else
cr = 1
End If
End Select
End If
Next
Return cr
End Function
EndClassI see the error in Locals window while debugging or in the report viewer that needs to show a report based on the IQueryable activities as datasource.
Cannot order by ‘MyNameSpace.FrmActivities+ActivityComparer’
In order to evaluate an indexed property, the property must be qualified and the arguments must be explicitly supplied by the user.What does this error message mean?
Thanks
Ruwel
解决方案I am providing the code for a Generic Sorter using Linq in VB:
Imports System.Linq.Expressions Public Class GenericListSorter(Of T) Public Function SortAscending(ByVal source As IEnumerable(Of T), ByVal sortBy As String) As IEnumerable(Of T) Dim param = Expression.Parameter(GetType(T), "item") Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))(Expression.Convert(Expression.[Property](param, sortBy), GetType(Object)), param) Dim IQue As IQueryable(Of T) = source.AsQueryable Dim IRet As IQueryable(Of T) = (IQue.OrderBy(Of Object)(sortExpression)) Return IRet End Function Public Function SortDescending(ByVal source As IEnumerable(Of T), ByVal sortBy As String) As IEnumerable(Of T) Dim param = Expression.Parameter(GetType(T), "item") Dim sortExpression = Expression.Lambda(Of Func(Of T, Object))(Expression.Convert(Expression.[Property](param, sortBy), GetType(Object)), param) Dim IQue As IQueryable(Of T) = source.AsQueryable Dim IRet As IQueryable(Of T) = (IQue.OrderByDescending(Of Object)(sortExpression)) Return IRet End Function End Class
这篇关于尝试对IQueryable进行排序时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文