【发布时间】:2019-12-31 20:09:33
【问题描述】:
我正在处理我们的销售部门仍在使用的旧的过时 4D 数据库。我创建了一个 ODBC 连接来读取表格,并一直在为我们的高管和经理创建可视化仪表板。
为了帮助理解.. 一个典型的数据库可能有一个 Order Table 和一个 OrderDetails 表。
此数据库有一个提案表和一个 [行项目] 表。此外,代替与给定 orderDetail 相关的可能的第三个子表(例如 OrderRelease),该数据库仅具有前面提到的 Singular [Line Item] 表,并且不存在将一个 lineitem 子级与父 lineitem 相关联的任何关系。 (一个 LineItem 可以有额外的 Line Items)
示例:
| ProdCode | Price | FeatureNum | LineNum | SortOrder | NoFeature |
| ProdA | 100,000 | | 1 | 0 | FALSE |
| ProdA | 0 | ProdA_SF1 | 2 | 1 | FALSE |
| ProdA | 0 | ProdA_SF2 | 3 | 1 | FALSE |
| ProdA | 5000 | ProdA_OF1 | 4 | 2 | FALSE |
现在.. 一个订单中可能有多个 ProductA,每个 ProductA 都有自己的特殊功能配置等。
查看 4D 中的原始代码,应用程序会逐行执行,并在以下情况下触发小计渲染:
- 订单项的 [NoFeature] 为 True
- 新的行项目记录已加载,并且该记录具有不同的产品代码
- 正在评估最后一个订单项
- 订单项的 [功能编号] 为空白,并且正在评估的订单项不是第一个订单项。
我要做的是设置一个迭代器扩展方法来处理这个自定义分组,并返回一个主行项目的 Ienumerable,并将它们的价格设置为呈现的小计。
这是我目前所拥有的:
<Extension>
Public Iterator Function SpecialGrouping(Of T)(source As IEnumerable(Of T),
ByVal predicate As Func(Of T, Integer, Boolean), ByVal Selector As Func(Of IEnumerable(Of T), T)) As IEnumerable(Of T)
Dim start As Integer = 0
While start < source.Count()
Dim enumerable = source.Skip(start).TakeWhile(predicate)
start += enumerable.Count
Yield Selector(enumerable)
End While
End Function
我不知道我的通用扩展方法实现有什么问题。我想这样称呼它:
Dim lineItems = GetLineItemsMethod ''for simplicity's sake
Dim subTotalRenderedMainItems = lineItems.SpecialGrouping(
Function(x, index) Not (x.NoFeatures OrElse (x.LineNum <> 1 AndAlso x.FeatureNum = Nothing) OrElse index = 0),
Function(x)
Dim MainItem = x.OrderBy(Function(y) y.LineNum).FirstOrDefault
MainItem.Price = x.Sum(Function(y) y.Price)
Return MainItem
End Function)
我们将不胜感激!
【问题讨论】:
标签: vb.net lambda iterator extension-methods ienumerable