簡體   English   中英

將帶有Aggregate子句的VB代碼轉換為C#

[英]Converting a VB code with an Aggregate clause to C#

我一直在嘗試將以下代碼從VB轉換為C#:

Dim rowsnotfound As DataRow() = (From rowstb2 As DataRow In dsNew.Tables("parts").Rows.OfType(Of DataRow)() Where (Aggregate rowstb1 As DataRow In dsOld.Tables("parts").Rows.OfType(Of DataRow)() Where ((rowstb1.Item("TRANSACTION")) = (rowstb2.Item("TRANSACTION")) And (rowstb1.Item("DESCRIPTION")) = (rowstb2.Item("DESCRIPTION")) And (rowstb1.Item("QTY")) = (rowstb2.Item("QTY")) And (rowstb1.Item("PART_NUM")) = (rowstb2.Item("PART_NUM"))) Into Count()) = 0).ToArray

我知道這將在計算機上顯示為一長串代碼,因此下面是代碼匯總部分的摘要,因此您可以輕松閱讀:

(Aggregate rowstb1 As DataRow In dsOld.Tables("parts").Rows.OfType(Of DataRow)() Where ((rowstb1.Item("TRANSACTION")) = (rowstb2.Item("TRANSACTION")) And (rowstb1.Item("DESCRIPTION")) = (rowstb2.Item("DESCRIPTION")) And (rowstb1.Item("QTY")) = (rowstb2.Item("QTY")) And (rowstb1.Item("PART_NUM")) = (rowstb2.Item("PART_NUM"))) Into Count())

我研究了聚合子句,並了解其工作原理。 但是,將其轉換為C#時遇到了很多麻煩。 任何幫助將不勝感激。

您正在執行的操作似乎等同於SQL LEFT JOIN操作,您想在First集合中查找不在Second集合中的元素。 您可以通過以下操作而不必使用聚合:

IEnumerable<DataRow> newRows = dsNew.Tables["parts"].Rows.OfType<DataRow>();
IEnumerable<DataRow> oldRows = dsOld.Tables["parts"].Rows.OfType<DataRow>();

DataRow[] rowsNotFound = newRows
.GroupJoin(oldRows, 
    o => new 
        { 
            Transaction = o.Field<int>("TRANSACTION"), 
            Description = o.Field<string>("DESCRIPTION"), 
            Quantity = o.Field<int>("QTY"), 
            PartNumber = o.Field<string>("PART_NUM") 
        },
    i => new 
        { 
            Transaction = i.Field<int>("TRANSACTION"), 
            Description = i.Field<string>("DESCRIPTION"), 
            Quantity = i.Field<int>("QTY"), 
            PartNumber = i.Field<string>("PART_NUM") 
        },
    (o, i) => new {NewRow = o, OldRows = i})
.SelectMany(g => g.OldRows.DefaultIfEmpty(), (g, oldRow) => oldRow == null ? g.NewRow : null)
.Where(r => r != null)
.ToArray();

我不知道數據類型,所以我根據字段名稱進行了猜測。

我認為它將是這樣的:

DataRow[] rowsnotfound = (
    from DataRow rowstb2 in dsNew.Tables("parts").Rows.OfType<DataRow>()
    where ((
            from DataRow rowstb1 in dsOld.Tables("parts").Rows.OfType<DataRow>()
            where (rowstb1["TRANSACTION"] == rowstb2["TRANSACTION"]
                && rowstb1["DESCRIPTION"] == rowstb2["DESCRIPTION"]
                && rowstb1["QTY"] == rowstb2["QTY"]
                && rowstb1["PART_NUM"] == rowstb2["PART_NUM"])
            select rowstb1).Count()) == 0).ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM