Linq查询返回重复项

本文关键字:返回 查询 Linq | 更新日期: 2023-09-27 18:26:08

所以我有两个DataTables,它们都来自同一ODBC数据源。其中一行表示销售额(Estado='VENTAS'),另一行表示Estado='EXIST'(数据库为每次销售创建行对,一行表示销售信息,另一列表示商店存款中的库存变动信息,因此为了了解哪家商店进行了销售,我必须[通过'Documento'ID字段]将每个VENTAS行与相应的EXIST行匹配,并获得"Deposito"Exist行的值)。

我构建这个查询就是为了做到这一点(我使用的ODBC驱动程序不允许连接,所以在Linq中进行连接是次佳选择)

            DataTable dtResult = new DataTable();
            dtResult.Columns.Add("Documento", typeof(Int64)); 
            dtResult.Columns.Add("Fecha", typeof(DateTime));
            dtResult.Columns.Add("Articulo", typeof(string));
            dtResult.Columns.Add("Deposito", typeof(string));
            dtResult.Columns.Add("ImpDMn", typeof(decimal));
            dtResult.Columns.Add("Cantidad", typeof(decimal));
            dtResult.Columns.Add("Partida", typeof(string));
            var result = from dataRows1 in VentasDT.AsEnumerable() //VentasDT is the DataTable with the VENTAS data
                         join dataRows2 in ExistDT.AsEnumerable() // ExistDT is the DataTable with the EXIST data
                         on dataRows1.Field<Int64>("Documento") equals dataRows2.Field<Int64>("Documento")
                         select dtResult.LoadDataRow(new object[]
         {
            dataRows1.Field<Int64>("Documento"),
            dataRows1.Field<DateTime>("Fecha"),
            dataRows1.Field<string>("Articulo"),
            dataRows2.Field<string>("Deposito"),
            dataRows1.Field<decimal>("ImpDMn"),
            dataRows1.Field<decimal>("Cantidad"),
            dataRows1.Field<string>("Partida"),
          }, false);
            result.CopyToDataTable();

它是有效的,但由于某种原因,它复制了一些行。我检查了重复的行,它们彼此完全相同。他们的文档编号是相等的(每个Documento编号只有一个VENTAS和一个EXIST行,包括这些重复行),所以我不知道为什么它们会重复。我检查了我加入的源数据表,同样,每个数据表中只有一行对应的重复数据。EXIST表比VENTAS表大(它还记录非销售商店之间的转移),但联接表比任何一个都大(但没有两者的总和大)

VENTAS: 85123
EXIST: 116857
JOIN: 141287

我的查询有问题吗?我应该包括一些GROUP BY子句或.Dispinct,还是这个结构(据我所见应该模仿左联接)已经足够了?

Linq查询返回重复项

由于执行此联接的唯一原因是从ExistDT获取"Deposito"字段的值,因此可以用字典查找代替联接。以下是您的操作方法:

var depositoPorDocumento = ExistDT.AsEnumerable().ToDictionary(
    dr => dr.Field<Int64>("Documento"),
    dr => dr.Field<string>("Deposito")
);
foreach (var vr in VentasDT.AsEnumerable()) {
    Int64 id = Field<Int64>("Documento");
    string deposito;
    if (!depositoPorDocumento.TryGetValue(id, out deposito)) {
        continue;
    }
    dtResult.LoadDataRow(new object[]
     {
        id,
        vr.Field<DateTime>("Fecha"),
        vr.Field<string>("Articulo"),
        deposito,
        vr.Field<decimal>("ImpDMn"),
        vr.Field<decimal>("Cantidad"),
        vr.Field<string>("Partida"),
      }, false);
}
result.CopyToDataTable();