为公开的 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"))
我有 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"))