循环遍历DAL中的数据

时间:2014-10-29 08:22:51

标签: vb.net

在我的dal中,它循环遍历我的数据表中的每一个然后应用于我的对象类。我希望能够做的是在它传递到我的对象类之前检查先前传递的行是否具有相同的产品代码。例如;

当前的数据行是;

ProductCode quantity
100001         500

如果传递的上一行数据具有相同的产品代码;

ProductCode quantity
100001         500

它将使用前一行添加数量以生成1000。

如果不是相同的产品代码,则只需将其应用于我的对象类

2 个答案:

答案 0 :(得分:2)

您希望DataTable中有running total吗?您可以使用LINQ:

var runningTotalsPerCode = table.AsEnumerable()
.Select(row => new
{
    ProductCode = row.Field<int>("ProductCode"),
    Quantity = row.Field<int>("Quantity"),
    AllFields = row.ItemArray
})
.GroupBy(x => x.ProductCode)   // group by the product-code
.SelectMany(g => g.            // flatten the group after the running-total was calculated
    Select((x, index) => new
    {
        x.ProductCode,
        x.Quantity,
        x.AllFields,
        RunningTotal = g.Take(index + 1).Sum(xx => xx.Quantity) 
    }));

然后,您可以循环它以创建新的DataTable或将值传递给您的对象。

编辑:哎呀,我只是注意到你想要VB.NET。给我几分钟......

Dim codeGroups = From row In table
                 Let ProductCode = row.Field(Of Int32)("ProductCode")
                 Let Quantity = row.Field(Of Int32)("Quantity")
                 Let Code = New With {ProductCode, Quantity, .AllFields = row.ItemArray}
                 Group Code By Code.ProductCode Into CodeGroup = Group
Dim runningTotalsPerCode = codeGroups.
    SelectMany(Function(g) g.CodeGroup.Select(Function(x, index) New With
    {
        g.ProductCode,
        x.Quantity,
        x.AllFields,
        .RunningTotal = g.CodeGroup.Take(index + 1).Sum(Function(xx) xx.Quantity)
    }))

使用此示例数据进行快速测试:

Dim table As New DataTable()
table.Columns.Add("ProductCode", GetType(Int32))
table.Columns.Add("Quantity", GetType(Int32))
table.Rows.Add(555555, 777)  ' other group
table.Rows.Add(100001, 500)
table.Rows.Add(100001, 444)
table.Rows.Add(100001, 442)

ProductCode=555555, Quantity=777, AllFields={Length=2}, RunningTotal=777    <anonymous type>
ProductCode=100001, Quantity=500, AllFields={Length=2}, RunningTotal=500    <anonymous type>
ProductCode=100001, Quantity=444, AllFields={Length=2}, RunningTotal=944    <anonymous type>
ProductCode=100001, Quantity=442, AllFields={Length=2}, RunningTotal=1386   <anonymous type>

答案 1 :(得分:1)

只需保留对先前创建的业务对象的引用。如果前一个目标代码等于当前代码,则将信息组合到前一个对象中。

取决于数据量以及业务逻辑的完成方式。这可以在你的循环之后完成。创建所有业务对象并将其插入列表时。您可以在列表中添加一个组合类似产品代码的函数。

更好的选择是在数据库中完成所有这些操作,并让查询返回所需的内容。