Asp.net mvc 3 在我的搜索操作方法中使用IQueryable或IEnumerable

Asp.net mvc 3 在我的搜索操作方法中使用IQueryable或IEnumerable,asp.net-mvc-3,ienumerable,iqueryable,Asp.net Mvc 3,Ienumerable,Iqueryable,我有以下行动方法:- [AcceptVerbs(HttpVerbs.Post)] public PartialViewResult Search(string q, int classid) { var users = r.searchusers(q, classid); // code does here.............. 它调用以下模型存储库方法:- public IQuery

我有以下行动方法:-

          [AcceptVerbs(HttpVerbs.Post)]
             public PartialViewResult Search(string q, int classid)
            {

                var users = r.searchusers(q, classid);
// code does here..............
它调用以下模型存储库方法:-

public IQueryable<User> searchusers(string q, int id)
        {
            return from u in entities1.Users
                 where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
                   select u;
}
publicIQueryable搜索用户(字符串q,int-id)
{
从实体1中的u返回。用户
其中(!u.Users\u Classes.Any(c=>c.ClassID==id)和&(u.UserID.Contains(q))
选择u;
}
现在,如果我将IQueryable更改为IEnumerable,如下所示,在这种情况下执行查询的方式会有任何更改吗-

public IEnumerable<User> searchusers(string q, int id)
        {
            return from u in entities1.Users
                 where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
                   select u;
}
public IEnumerable searchusers(字符串q,int-id)
{
从实体1中的u返回。用户
其中(!u.Users\u Classes.Any(c=>c.ClassID==id)和&(u.UserID.Contains(q))
选择u;
}

是,它将更改查询,您希望对使用远程数据源的任何内容使用IQuerable

在您的情况下,它将强制linq执行查询,而IQuerable将等待其他人执行查询。IQuerable允许他们(如果他们愿意)附加更多条件以向下推送到数据库执行


我通常在层边界强制执行IEnumerable,这是我不希望人们修改系统将要生成的查询的地方。

是的,在我的测试中,一旦您强制转换为IEnumerable,它将确定查询SQL。执行查询后,您执行的任何其他查询组合都将在内存中完成

因此,假设您有一个基本查询,它加载一个用户列表并返回一个IEnumerable。然后在您实际运行该列表(从而执行该查询)之前,您还要添加一个.Where(i=>i.username='bob')。在这种情况下,它将执行整个select,然后为“Where username='bob'”对内存中的对象应用LINQ过滤器部分,这可能不是您想要的,相反,您希望整个过程作为SQL语句的一部分运行


因此,是的,只要有可能,请始终使用IQueryable,以便立即运行您的完整合成。

谢谢您的回复,但这对我的情况也有效吗,因为我正在应用“where”1.用户因此系统应该在两种情况下应用数据库中的where子句,对吗?.感谢您的回复;您的意思是如果我在应用程序中如上所述使用Ienumerable,那么系统将从数据库中检索所有用户对象,并在应用程序中应用where子句服务器级别!!!BR