繁体   English   中英

在ASP.Net MVC中,当实现搜索时,应该将where子句添加到ienumerable还是iqueryable中?

[英]In ASP.Net MVC should I add my where clause to my ienumerable or iqueryable when implementing search?

我想知道用户何时进入我网站上表的索引页面并使用搜索功能,是否应该将where子句添加到ienumerable或iqueryable? 我知道这两种方法都可以完成,但是哪一种效率更高,可以向iqueryable添加自定义搜索字符串扩展吗?

将其添加到IQueryable会将其添加到数据库查询中,因为它是与数据库的实时连接的一部分。

执行查询后,将其添加到IEnumerable(不是IQueryable类型)将在内存中进行过滤。

如果您要处理基础IQueryable,则在两种情况下,我都怀疑会有所不同。 但是,建议您在sql探查器中查看结果查询,以确保您正在执行预期的查询。

我以防万一,将其添加到您的IQueryable中,但是由于这两个都是接口,因此可能并不重要。 如果您的IEnumerables始终是IQueryables,您仍应获得在数据库上而不是在数据库返回结果之后运行查询的好处。

IQueryableIEnumerable称为“接口”。 接口定义了实际对象应该能够响应的API,同时允许实际类型 (阅读:对象实现的类)具有一定程度的可变性。 只要该类型实现了接口,一切都将起作用,并且(大多数情况下)您可以将一种类型交换为另一种类型,只要它们都实现相同的接口即可。

就是说, IQueryable实际上是IEnumerable的扩展,因此就您在此处所讨论的目的而言,它们实际上是同一件事。 换句话说,这与从数据库返回的对象集是否IQueryable转换为IQueryableIEnumerable 在这两种情况下,查询都可能已经执行,也可能尚未执行,因为这两个接口都不指示必须执行查询。 重要的是您是否在代码中做了某些操作导致查询被执行:诸如转换为列表( .ToList() )或遍历结果集( forforeach等)之类的事情,等等。 。运行计数也将执行查询,但是出于稍微不同的原因(您将向数据库发出COUNT查询,而不是SELECT)。

道理是,您只需要注意代码的哪些部分实际上将导致查询被执行,并确保在此之前发生任何查询更改。

根据您对情况的描述,我将使用IQueryableWhere()进行操作,然后将其List<SomeViewModel>List<SomeViewModel>以将其返回到您的页面。 这样做将推迟对数据库的查询执行,直到您对查询进行了细化以返回所需的内容为止。

代替自定义搜索字符串扩展,我使用普通的旧变量并根据传入的内容缩减对象。因此,如果您要编写一个将firstNamelastName作为参数的搜索控制器,则可以执行以下操作:

IQueryable<User> users = Context.Users;

if (firstName != null)
    users = users.Where(x => x.FirstName == firstName);

if(lastName != null)
    users = users.Where(x => x.LastName == lastName);

List<SearchResultViewModel> model = users.Select(x => new SearchResultViewModel
        {
            FirstName = x.FirstName,
            LastName = x.LastName,
            JobTitle = x.JobTitle
            // and so forth for whatever fields you need to return...
        }).ToList();
        // The ToList() will cause the query to be 
        // evaluated and executed.

自然地,您应该检查以确保其中至少一个搜索字段中包含某些内容,这样就不会返回整个表的数据价值。 在这里,您可以绑定它来接受用于分页的变量,应用排序以及各种有趣的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM