【问题标题】:Using IQueryable Or IEnumerable inside my search action method在我的搜索操作方法中使用 IQueryable 或 IEnumerable
【发布时间】:2012-03-03 23:36:19
【问题描述】:

我有以下操作方法:-

          [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;
}

【问题讨论】:

    标签: asp.net-mvc-3 ienumerable iqueryable


    【解决方案1】:

    是的,它会改变查询,你想将 IQuerable 用于任何使用远程数据源的东西。

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

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

    【讨论】:

    • 感谢您的回复;你的意思是如果我在我的应用程序中使用 Ienumerable,那么系统将从数据库中检索所有用户对象并在应用程序服务器级别应用 where 子句!!! BR
    【解决方案2】:

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

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

    所以,是的,只要有可能,请始终使用 IQueryable,以便一次运行完全组合的内容。

    【讨论】:

    • 感谢您的回复,但这在我的情况下也有效吗,因为我在实体 1.Users 的一个语句中应用了“where”子句,因此系统应该应用 where 子句两种情况下的数据库,对吗?
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多