假设我有一个Entity Framwork查询
var query = db.Entities
.FancyQueryStuff()
.Where(GetFilter()) // *
.OrderBy(GetSort()) // *
.Take(GetNumberOfRows()) // *
;
并认为此查询非常慢。测试显示以下重写速度更快:
var ids = db.Entities
.FancyQueryStuff()
.Where(GetFilter()) // *
.OrderBy(GetSort()) // *
.Take(GetNumberOfRows()) // *
.Select(x => x.Id)
.ToArray()
;
var query = db.Entries
.FancyQueryStuff()
.OrderBy(GetSort()) // *
.Where(x => ids.Contains(x.Id));
这是否更快取决于很多事情,包括使用的sql数据库,但我有一个场景,其中SQL Server和特定查询进行大量加入。
现在我遇到的问题是我想要使用IQueryable
s的库并在内部应用Where
,OrderBy
,Take
和Skip
从其他地方获取UI信息(DevExpress / Telerik网格与分页,用户点击标题进行排序等)。
这意味着我必须以一种形式编写查询,其中所有标有星号的行都可以由第三方框架应用。
例如,使用Devextreme,您有一个方法可以获取查询以及表示自定义格式的过滤器/排序/分页的数据结构,并返回您应该传递给html应用程序中的客户端的查询结果:
var result = DataSourceLoader.Load(query, loadOptions);
DataSourceLoader.Load
将我用星号标记的所有类型应用到查询的末尾,执行它并返回结果。
我想我可以用一些重型的linq magic(动态linq?)来做我想要的事情,但在我尝试自己之前,我想也许有人已经准备好了这个可能并不太常见的用例。