从IOrderedQueryable

时间:2019-08-13 12:05:35

标签: c# linq iqueryable

我正在使用IQueryable接口设置CreateFilteredQuery。我必须返回一个IQueryable值,但通过OrderBy函数获取IOrderedQueryable。有没有办法将所有具有该顺序的敏感数据(不是顺序的格式和那些不必要的数据)复制到一个IQueryable中?

我几乎尝试了所有事情。我不能更改返回值,因为这些函数也用于另一个“过滤器”。

我正在尝试对最初是字符串列但填充有数字的列进行排序,因此我必须解析为Int,然后解析为orderby。 (如果我不这样做,那么我订购的结果将是:1 2 20 22 3而不是1 2 3 20 22)

我使用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.DbSetIQueryable。在此之前,我只有System.Linq.OrdenedEnumerable,或者只是IOrderedEnumerable

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

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

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

快乐编码

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

类似这样的东西

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

答案 2 :(得分:0)

我认为您的根本问题是要求一个IQueryable返回类型。我假设目的是要在基本查询上添加其他数据库级别的操作(排序,过滤)。这里的问题是IQueryable提供者支持一组有限的操作,因此您通常必须转义数据库层(我将使用AsEnumerable()而不是ToList(),BTW)来应用内存中的操作。完成此操作后,将无法返回数据库层。

如果将期望的返回类型更改为IEnumerable,则应该会丢失编译错误。

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

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