为公开的 IQueryable<T> 接口处理自定义 KPI 计算

Process custom KPI calculations for IQueryable<T> interface exposed

我有 IQueryable<T> 接口由进程外缓存框架 (Apache-Ignite) 公开,我的处理要求是过滤、排序、分页数据以及过滤数据数字列 (int) , double), 计算 sum, min, max, avg 之类的摘要 KPI,因为它需要在通话结束时显示在 Ui 中。

例如,Type Person:

public class Person
{
  public string Name {get;set;}

  public int Age {get;set;}

  public double Salary {get;set;}
}

我的查询如下:

IQueryable<Person> personQueryable = <Fetch Queryable API>

var result = personQueryable.AsParallel()   // For Parallel Processing
                            .Where(// Apply Filter) // Filter Data
                            .OrderBy(// Order By Clause) // Sort Data
                            .Take(// Pagination) // Take a Subset of Data

现在的挑战是,虽然我想为数字列 Age,Salary 计算摘要 KPI (sum, min, max, avg),但这需要在过滤记录上完成,而不是分页记录,那么如何完成同样的事情。

一种选择是将所有筛选的记录放入活动内存(列表)中,然后计算 KPI,但有时筛选的数据可能 > 100 K,从而使响应变慢,不知道如何实现它。

在我看来,我需要 return 一个包装器对象,它在 运行 时根据传递的数字列动态计算 KPI,它可以存储在字典中,带有列名称作为键,KPI 调用作为给定列的所有计算的值。

另请注意,目前我们使用 In process Cache,所以我们使用自定义扩展方法对 IEnumrable<T> 进行所有处理,我在想的另一点是我可以简单地将 IEnumrable<T> 替换为IQueryable<T> 和所有扩展方法将在进程外缓存级别按原样工作,当数据序列化为 Ui 时,我将获得最终结果。 .

无法一次检索一页数据并汇总整个数据集。您必须执行两次调用,一次获取分页数据,一次计算聚合。

看起来您使用的是 Ignite LINQ,因此查询已配置。在这种情况下,只需执行一个单独的 SQL 查询:

personCache.QueryFields(new SqlFieldsQuery("select min(age), max(age), avg(age), sum(age), min(salary), max(salary), avg(salary), sum(salary) from person"))