如何使用OrderBy扩展方法与动态对象的集合?



我有一个集合变量,它的元素是dynamic类型,它是使用Dapper扩展从数据库返回的。

返回的集合是这样的(变量名是reporte):

[0]: {{DapperRow, centroCosto = '(sin centro de costo)', Almuerzo = '20', Cena = '11', Desayuno = '2', Once = '3', servicios = '36', valorTotal = '106800,00'}}
[1]: {{DapperRow, centroCosto = 'ASESOR', Almuerzo = '18', Cena = '0', Desayuno = '0', Once = '0', servicios = '18', valorTotal = '55800,00'}}
[2]: {{DapperRow, centroCosto = 'AUXILIAR DE ASEO', Almuerzo = '6', Cena = '10', Desayuno = '5', Once = '6', servicios = '27', valorTotal = '70300,00'}}
[3]: {{DapperRow, centroCosto = 'DEMO', Almuerzo = '1437', Cena = '669', Desayuno = '57', Once = '71', servicios = '2234', valorTotal = '6880000,00'}}
[4]: {{DapperRow, centroCosto = 'INFORMÁTICA', Almuerzo = '4', Cena = '0', Desayuno = '0', Once = '0', servicios = '4', valorTotal = '12400,00'}}
[5]: {{DapperRow, centroCosto = 'PRACTICA DEMO', Almuerzo = '20', Cena = '0', Desayuno = '0', Once = '0', servicios = '20', valorTotal = '62000,00'}}
[6]: {{DapperRow, centroCosto = 'PRODEMO', Almuerzo = '81', Cena = '92', Desayuno = '2', Once = '3', servicios = '178', valorTotal = '563200,00'}}

从这个列表中,我告诉你centroCosto,serviciosvalorTotal字段是已知的和固定的,所以,我可以使用reporte.OrderBy(r => r.centroCosto),reporte.OrderBy(r => r.servicios)reporte.OrderBy(r => r.valorTotal)按这些字段中的任何一个排序。

其他字段是动态的,我事先不知道它们的名字(这就是我使用Dapper的原因)。

如何按这些字段排序?例如,按Almuerzo字段?

如果您将列表对象转换为字典以获取列名以按顺序排序,然后再转换回列表。您可以对整个列表进行排序,然后您可以将它与dto一起使用,以

方式将列表传递回客户端:例如,您的列表名称是ulist.,您可以将其写为:

ulist.OrderBy(r => ((IDictionary<string, object>)r)[columnName]);

其中r为列表中的一个对象,columnName为该对象对应的实体。