Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将带有聚合子句的VB代码转换为C_C#_Vb.net_Aggregate - Fatal编程技术网

C# 将带有聚合子句的VB代码转换为C

C# 将带有聚合子句的VB代码转换为C,c#,vb.net,aggregate,C#,Vb.net,Aggregate,我一直在尝试将以下代码从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")

我一直在尝试将以下代码从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时遇到了巨大的困难。任何帮助都将不胜感激。

我认为它将类似于:

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();

您所做的操作似乎相当于SQL左联接操作,您希望在第一个集合中查找不在第二个集合中的元素。通过使用以下方法,您无需使用聚合即可完成此操作:

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();

我不知道数据类型,所以根据字段名猜测。

这样做时,我在0后面的括号中收到一个错误,表示查询体必须以select子句或group子句结尾,另一个错误是select子句中的表达式类型不正确。调用“Select”时类型推断失败原始代码的第一部分在dsNew.tableParts.Rows.OfTypeOf DataRow中作为DataRow从rowstb2中包含如何?我在你的代码中没有看到任何类似于这一行的东西。没有必要吗?@Jared.Rodgers我没有包括它,但是newRows将是您分配给dsNew.Tables[parts].Rows.OfType的变量。我将更新我的代码以显示这一点。