C# 将IQueryable从IOrderedQueryable转换为IQueryable

C# 将IQueryable从IOrderedQueryable转换为IQueryable,c#,linq,iqueryable,C#,Linq,Iqueryable,我正在使用IQueryable接口设置CreateFilteredQuery。我必须返回一个IQueryable值,但我通过OrderBy函数得到了IOrderedQueryable。是否有任何方法可以将所有合理的数据(而不是从订单和那些不必要的数据中格式化)以该顺序复制到一个IQueryable数据中 我几乎什么都试过了。我无法更改返回值,因为函数也用于另一个“过滤器” 我试图对一个原本是字符串列但填充了数字的列进行排序,所以我必须解析为Int,然后是orderby。(如果我不这样做,如果我命

我正在使用IQueryable接口设置CreateFilteredQuery。我必须返回一个IQueryable值,但我通过OrderBy函数得到了IOrderedQueryable。是否有任何方法可以将所有合理的数据(而不是从订单和那些不必要的数据中格式化)以该顺序复制到一个IQueryable数据中

我几乎什么都试过了。我无法更改返回值,因为函数也用于另一个“过滤器”

我试图对一个原本是字符串列但填充了数字的列进行排序,所以我必须解析为Int,然后是orderby。(如果我不这样做,如果我命令,结果将是:1230223而不是123022)

我用
base.CreateFilteredQuery(input)
创建了“tareas”,并试图在解析为int之前按externalId排序

if (input.Sorting == "externalId asc")
{
    var tareasOrdenadas = (tareas.ToList()).OrderBy(t => int.Parse(t.ExternalId));
    return tareasOrdenadas;
}
我希望输出
System.Data.Entity.DbSet
IQueryable
。在此之前,我拥有
System.Linq.OrdenedEnumerable
或者只是
iordenedenumerable

PD:当我在其他过滤器中修改“tareas”时,我有一个“System.Data.Entity.Infrastructure.DbQuery值用于System.Linq.IQueryable类型”

我需要一个IQueryable类型,而不是IOrderedEnumerable,AsQueryable()不起作用

PD2:谢谢大家的帮助。很抱歉没有回复,我离开办公室几天了。我会尽你所能,谢谢大家


快乐编码

您可以在IEnumerable序列上调用.AsQueryable(),它将返回IQueryable

您可以在数据库中编写一个db函数,将字符串转换为整数(因为没有任何内置函数),并在linq查询中使用该函数,在排序时将该字符串值转换为整数。这样,您就不必调用.ToList()方法

像这样的

if (input.Sorting == "externalId asc")
{
   // you can easily return IOrderedQueryable as IQueryable
   retrun  tareas.OrderBy(t => context.YourDBFunction(t.ExternalId));
}

我认为您的根本问题是需要
IQueryable
返回类型。我假设其目的是在基本查询中添加额外的数据库级操作(排序、筛选)。这里的问题是,
IQueryable
提供程序支持有限的一组操作,因此您通常必须退出数据库层(我将使用
AsEnumerable()
,而不是
ToList()
,顺便说一句)来应用内存操作。一旦这样做了,就无法返回到数据库层

如果将预期返回类型更改为
IEnumerable
,则会丢失编译错误

另一种选择是使用
Convert.ToInt32
而不是
int.Parse
停留在数据库层:

if (input.Sorting == "externalId asc")
{
    var tareasOrdenadas = tareas.OrderBy(t => Convert.ToInt32(t.ExternalId));
    return tareasOrdenadas;
}

我不明白你的问题。请输入并包含。此代码将读取内存中
tareas
后面表格中的所有内容,并尝试在本地对其进行排序。为什么不直接使用tareas.OrderBy(t->t.extensralid)?如果
ExternalId
是一个字符串而不是一个数字,那么这是一个需要修复的错误
01
1
由于数字相同,而字符串完全不同,因此ExternalId在数据库架构中不是int类型是有原因的吗?如果所有ExternalId都可以解析,那么在您的模式级别修复问题,然后在EF模型中修复问题,这样您就不必执行ToList()或Parse(),整个问题就会消失。为什么
ExternalId
是一个字符串?这将允许重复的数字,如
001
01
1
。如果这是可以接受的,那么在SQL中使用数字排序是没有意义的。当SQL根据ie
001
01
1
应用正确的字母顺序时,所有这些ID都将以随机顺序出现。实际的问题是排序。如果您先按长度排序,然后按字符串值排序,您将获得与数字排序等效的排序(如果没有前导零),您可以返回
IQueryable
。虽然这将允许编译,但它只会掩盖
ToList()
导致的错误。再也没有可查询的了,整个表已经加载到内存中了。我想问题恰恰是要解决编译问题。在查询之前或之后收集数据大致取决于上下文,我无法确定删除ToList()是否是一个好答案。这是另一件事:继承自
IQueryable
。不应该有任何编译问题。如果有,人们将无法在
OrderBy
之后使用任何LINQ操作符。我怀疑OP混淆了列表上的IOrderedEnumerable和IOrderedQueryableOrderBY,返回的是IOrderedEnumerable而不是IOrderedQueryable。给定的示例是合法的,不可编译。我讨论的是问题本身,它询问如何将IQueryable从IOrderedQueryable转换为
convert IQueryable。我怀疑OP混淆了可枚举项和查询项。您不认为这会引发错误“LINQ to Entities无法识别方法'Int32 ToInt32(System.Object)”?@WamiqRehman(我读过的EF5及更高版本)会将其转换为SQL中的强制转换表达式,但是是的,它可能会遇到与
int.Parse
相同的问题。EF core将其转换为
CONVERT(int,[ColumnName])
,EF6不会。这是可悲的,即使LinqtoSQL也能做到。