在我的搜索操作方法中使用IQueryable或IEnumerable

时间:2012-02-12 01:56:54

标签: 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 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;
}

现在,如果我将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;
}

2 个答案:

答案 0 :(得分:1)

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

在你的情况下,它会强制linq执行查询,因为IQuerable会等到其他人执行查询。如果他们愿意,IQuerable允许他们附加更多条件来推送到数据库执行。

我通常在图层边界强制执行IEnumerable,我不想让人们修改系统要生成的查询。

答案 1 :(得分:1)

是的,在我的测试中,一旦你转换为IEnumerable,它就决定了查询SQL。之后执行的任何其他查询组合将在执行查询后在内存中完成。

假设您有一个基本查询,用于加载用户列表并返回IEnumerable。然后在实际运行该列表(从而执行查询)之前,还要添加.Where(i =&gt; i.username ='bob')。在这种情况下,它将执行整个select,然后在内存过滤器中为“where username ='bob'”部分应用LINQ-to-Objects,这可能不是你想要的,而是你想要整个事情来作为SQL语句的一部分运行。

所以是的,总是尽可能地使用IQueryable,以便立即运行完全合成。