我正在使用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.DbSet
或IQueryable
。在此之前,我只有System.Linq.OrdenedEnumerable
,或者只是IOrderedEnumerable
PD:当我在其他过滤器中修改“ tareas”时,我有一个System.Linq.IQueryable类型的“ System.Data.Entity.Infrastructure.DbQuery值”
我需要一个IQueryable类型,而不是IOrderedEnumerable,AsQueryable()不起作用
PD2:谢谢大家的帮助。抱歉,没有回复,我已经离开办公室几天了。我会尽你所能给我的,谢谢大家。
快乐编码
答案 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;
}