“至less有一个对象必须从LINQ查询结果中实现IComparable”exception

我没有非常广泛地使用LINQ,但我试图从一个大的Excel电子表格(14K +行)读取数据,这需要我从多个工作表进行查询,甚至重新查询原始电子表格以过滤特定的数据。 由于Excel的OleDb查询可能需要相对较长的时间(本地计算机上每个查询文件的查询次数为500 + ms),因此我在方法前面执行了一些查询,通过“基本” DataTable,然后尝试使用LINQ来过滤该循环内的数据,以将相应的数据放入更加结构化的DataSet中。 这里有一些代码来帮助解释(VB.NET):

Dim Connection As System.Data.OleDb.OleDbConnection Dim Command As System.Data.OleDb.OleDbDataAdapter Dim EXCEL_SHEET_DATA_1 As New DataTable Dim EXCEL_SHEET_DATA_2 As New DataTable Dim EXCEL_SHEET_DATA_3 As New DataTable Dim TapeFile As New FileInfo("C:\TempFolder\tapefile.xls") Connection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" & TapeFile.FullName & "'; Extended Properties=Excel 8.0;") Command = New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [SHEET1$] ORDER BY [USER_ID] ASC, [MEMBER_NUMBER] ASC;", Connection) Command.Fill(EXCEL_SHEET_DATA_1) Command.Dispose() Command = New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [SHEET2$] ORDER BY [USER_ID] ASC, [MEMBER_NUMBER] ASC;", Connection) Command.Fill(EXCEL_SHEET_DATA_2) Command.Dispose() Command = New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [SHEET3$] ORDER BY [USER_ID] ASC, [MEMBER_NUMBER] ASC;", Connection) Command.Fill(EXCEL_SHEET_DATA_3) Command.Dispose() For Each Row As DataRow In EXCEL_SHEET_DATA_1.Rows Dim MemberNumber As String = Row("MEMBER_NUMBER").ToString.Trim Dim UserNumber As String = Row("USER_ID").ToString.Trim ' -- CODE FOR INITIAL PROCESSING OF SHEET1 DATA - NO ERRORS -- Dim CoMemberQuery As IEnumerable(Of DataRow) = From cm In EXCEL_SHEET_DATA_2 Where cm("MEMBER_NUMBER") = MemberNumber And cm("USER_ID") = UserNumber For Each CoMemberRow As DataRow In CoMemberQuery ' -- CODE FOR PROCESSING OF SHEET2 DATA - NO ERRORS -- Next CoMemberRow Dim VehicleQuery As IEnumerable(Of DataRow) = From veh In EXCEL_SHEET_DATA_1 Where veh("MEMBER_NUMBER") = MemberNumber And veh("USER_ID") = UserNumber Order By veh("VIN") Ascending ' ******************************************************* ' -->> HERE IS WHERE I *SOMETIMES* GET THE EXCEPTION <<-- ' ******************************************************* For Each VehicleRow As DataRow In VehicleQuery ' -- CODE FOR SECONDARY PROCESSING OF SHEET1 DATA - NO ERRORS -- Next VehicleRow Next Row 

我每次都没有例外。 我唯一注意到可能与它有关的事情是,对于导致第一个exception的特定MemberNumberUserNumber组合,结果集中的第一行很可能包含VIN字段的NULL值。

我敢肯定,这个问题与我的LINQ查询语法有关,但在这方面我太缺乏经验,不知道为什么会失败。 任何援助将不胜感激。 如果您需要任何关于代码或实现的更多信息,请告诉我,我将尝试将其添加到问题中。 感谢您的时间。

您的VehicleQuery具有以下词组: Order By veh("VIN") Ascending

因此,一旦VehicleQuery得到评估(通过启动For循环),LINQ将评估该查询中的所有项目,然后执行sorting操作,该操作涉及比较veh("VIN")值,并将它们为了。

比较查询中的任何两个项目时,它会尝试查看是否有任何值知道如何将自身与其他types的值进行比较(因此实现了IComparable接口。如果不能,那么它不知道哪一个应该先去。

我的猜测是veh("VIN")是(有时)产生不知道如何与这个expression式返回的值相比较的对象。 根据您使用的数据types以及您希望如何比较的方式,您可以考虑进行某种types的转换或转换,或者直接调用ToString()以确保其具有可比性: Order By veh("VIN").ToString() Ascending

(请原谅任何语法错误,因为我是C#开发人员。)