尝试对IQueryable进行排序时出错 [英] Error trying to sort IQueryable

查看:61
本文介绍了尝试对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 SortOrder

Definition 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
 EndClass

I 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆