如何写两步first-l2e-then-l2o IQueryable?

时间:2016-07-25 10:15:59

标签: entity-framework linq dynamic-linq

假设我有一个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的库并在内部应用WhereOrderByTakeSkip从其他地方获取UI信息(DevExpress / Telerik网格与分页,用户点击标题进行排序等)。

这意味着我必须以一种形式编写查询,其中所有标有星号的行都可以由第三方框架应用。

例如,使用Devextreme,您有一个方法可以获取查询以及表示自定义格式的过滤器/排序/分页的数据结构,并返回您应该传递给html应用程序中的客户端的查询结果:

var result = DataSourceLoader.Load(query, loadOptions);

DataSourceLoader.Load将我用星号标记的所有类型应用到查询的末尾,执行它并返回结果。

我想我可以用一些重型的linq magic(动态linq?)来做我想要的事情,但在我尝试自己之前,我想也许有人已经准备好了这个可能并不太常见的用例。

0 个答案:

没有答案