将一个任意类型的IQueryable发送到一般方法

时间:2015-02-25 20:00:10

标签: asp.net-mvc entity-framework iqueryable

问题:我正在尝试创建一个将采用IQueryable的通用方法,该方法可以是许多不同类型的数据,包括自定义。在这个方法中,我将根据传入的IQueryable的类型进行排序。

我正在做的是创建一个包含以下内容的自定义类:

public class sortObject
{
        public String OrderParam { get; set; }
        public int pageSize { get; set; }
        public int pageIndex { get; set; }//This is what page the user is on
        public IQueryable<dynamic> entity { get; set; }
}

我会将IQueryable对象传递给这个对象,如下所示:

sortObject so = new sortObject();
so.entity = _context.userAcount.Select(x=>x);
...

so.entity将是IQueryable<dynamic>但是在对象的基本部分(在调试时)将是userAccount类型。我希望基数中的数据能够运行搜索。

我的问题是我不知道IQueryable类型在运行时是什么,因为这是一般方法。它可以是用户类型,也可以是类型地址等,但排序仍然有效,因为我将在sortObject中传入我想要的内容。

如何在运行时获取基础数据或转换IQueryable类型?

我发现这适用于排序表方法:

var entity = so.entity.AsQueryable().OrderBy("UserName");
var data = entity.Skip(so.pageSize*(so.pageIndex-1)).Take(so.pageSize);

1 个答案:

答案 0 :(得分:2)

我认为你想要的是一个涉及泛型的解决方案 - 试试

public class sortObject<T>
{
    public String OrderParam { get; set; }
    public int pageSize { get; set; }
    public int pageIndex { get; set; }//This is what page the user is on
    public IQueryable<T> entity { get; set; }
}

这样您就可以声明sortObject entity的{​​{1}}类型IQuerable

您可以使您的方法类似

public void DoSomething<T>(sortObject<T> input)
{
    // input.entity is now of type T
}

你可以致电

sortObject so = new sortObject<userAccount>();
so.entity = _context.userAcount.Select(x=>x);
DoSomething(so);