linq 按其他ID列表对IQueryable排序会导致SystemInvalidOperationException

lsmd5eda  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(151)

我有一个自定义对象的IQueryable,它包含多个属性,但是,只有ID应该与此相关。我创建了一个方法,它提供了一个基于其他属性的ID列表,告诉我如何对IQueryable对象进行排序。
然后我试着这样命令它:query = query.OrderBy(q => sortedList.IndexOf(q.ID));
但是,如果我尝试在IQueryable上执行其他操作,例如执行.ToList()或获取一页数据,我会遇到InvalidOperationException,说LINQ查询无法转换。
我期望IQueryable对象被正确排序/排序。

9gm1akwq

9gm1akwq1#

使用Entity Framework时,OrderBy表达式被转换为SQL查询(或等效查询,具体取决于数据库提供程序),以便可以在数据库服务器上执行。这发生在枚举查询时,在您的情况下,当您调用ToList时。
Entity Framework无法将函数sortListed.IndexOf转换为SQL语句,因为数据库没有已排序列表的副本(已存在于内存中),这就是您看到错误的原因。EF只能翻译相对简单的表达。
您需要尝试找到另一种方式来对查询进行排序,但要得到您想要的结果将取决于sortedList的排序方式。
希望这能为你指明正确的方向。
更新...
要根据不同的属性对IQueryable进行排序,具体取决于每个项上名为Flag的属性,您可以这样做:

query = query.OrderBy(q => q.Flag ? q.PropertyA : q.PropertyB)

相关问题