获取LINQ查询结果的源行?

时间:2017-07-04 16:21:13

标签: vb.net linq

在下面的LINQ示例中,如何从组成的原始行中获取索引号列表?我想向用户显示数据的来源。

    Dim inputDt As New DataTable
    inputDt.Columns.Add("Contractor")
    inputDt.Columns.Add("Job_Type")
    inputDt.Columns.Add("Cost")

    inputDt.Rows.Add({"John Smith", "Roofing", "2408.68"})
    inputDt.Rows.Add({"John Smith", "Electrical", "1123.08"})
    inputDt.Rows.Add({"John Smith", "Framing", "900.99"})
    inputDt.Rows.Add({"John Smith", "Electrical", "892.00"})

    Dim results = From rows In inputDt Where rows!Contractor <> ""
                  Group rows By rows!Job_Type
                    Into cost_total = Sum(CDec(rows!Cost))

    For Each r In results
        ' Show results.
        'r.Job_Type
        'r.cost_total

        ' Show line numbers of original rows... ?
    Next

对于结果(Job_Type =“Electrical”,cost_total = 2015.08),原始索引号为1和3.

由于

1 个答案:

答案 0 :(得分:1)

首先,也许最重要的是,设置 --------------------------------------------------------------------------- InvalidParameterValueException Traceback (most recent call last) <ipython-input-2-9dd3ac986601> in <module>() 93 uploadId=multi_up['uploadId'], 94 range='bytes {}-{}/*'.format(lower, upper), ---> 95 body=upload) 96 upload_info.append(up_part) 97 checksum = calculate_tree_hash(upload) ~/anaconda/lib/python3.5/site-packages/botocore/client.py in _api_call(self, *args, **kwargs) 251 "%s() only accepts keyword arguments." % py_operation_name) 252 # The "self" in this scope is referring to the BaseClient. --> 253 return self._make_api_call(operation_name, kwargs) 254 255 _api_call.__name__ = str(py_operation_name) ~/anaconda/lib/python3.5/site-packages/botocore/client.py in _make_api_call(self, operation_name, api_params) 555 error_code = parsed_response.get("Error", {}).get("Code") 556 error_class = self.exceptions.from_code(error_code) --> 557 raise error_class(parsed_response, operation_name) 558 else: 559 return parsed_response InvalidParameterValueException: An error occurred (InvalidParameterValueException) when calling the UploadMultipartPart operation: Content-Range: bytes 0-33554431/* is incompatible with Content-Length: 1073745600 。这将不允许旧的VB6样式Option Strict On类型表示法。但这是更好的,因为这种方式总是返回Object而数据很少。这完全没有损失,因为NET有更好的方法来输入和转换变量。

其次,有些相关,即所有rows!Cost列都是文本,即使其中一列是十进制的。接下来,您的查询与使用表中的数据有关,但您还希望包含DataTable 属性,这有点奇怪。更好的方法是在数据中添加DataRowId作为标识符。如果View(行的顺序)发生变化,这也有助于结果。

您没有说明您是否需要CSV索引(现在是ID)或它们的集合。它们的CSV似乎更简单,所以这就是它的作用。

该代码还使用更多惯用名称,并使用其他扩展方法演示将数据转换为所需类型。它还使用扩展方法方法。首先是指定了非字符串数据类型的DataTable:

Number

然后查询:

Dim inputDt As New DataTable
inputDt.Columns.Add("ID", GetType(Int32))
inputDt.Columns.Add("Contractor")
inputDt.Columns.Add("JobType")
inputDt.Columns.Add("Cost", GetType(Decimal))

inputDt.Rows.Add({1, "John Smith", "Roofing", "2408.68"})
inputDt.Rows.Add({5, "John Smith", "Electrical", "1123.08"})
inputDt.Rows.Add({9, "John Smith", "Framing", "900.99"})
inputDt.Rows.Add({17, "John Smith", "Electrical", "892.00"})

过度滚动是不幸的,但我离开它以允许这些条款与&#34;等级&#34;他们在表演。如您所见,在Dim summary = inputDt.AsEnumerable().GroupBy(Function(g) g.Field(Of String)("JobType"), Function(k, v) New With {.Job = k, .Cost = v.Sum(Function(q) q.Field(Of Decimal)("Cost")), .Indices = String.Join(",", inputDt.AsEnumerable(). Where(Function(q) q.Field(Of String)("JobType") = k). Select(Function(j) j.Field(Of Int32)("Id"))) }). OrderBy(Function(j) j.Cost). ToArray() ' Debug, test: For Each item In summary Console.WriteLine("Job: {0}, Cost: {1}, Ids: {2}", item.Job, item.Cost, item.Indices) Next 上运行单独的查询以获取匹配的指标。

写一个像

这样的东西更典型一些
DataTable

但您可以使用this overload of GroupBy跳过SELECT,如上所述:

Dim foo = Something.GroupBy(...).Select(...)

结果:

  

工作:框架,成本:900.99,Ids:9
  职位:电气,成本:2015.08,Ids:5,17
  工作:屋顶,成本:2408.68,Ids:1