代码之家  ›  专栏  ›  技术社区  ›  monstertjie_za

匿名对象上的Distinct()不在LINQ中工作

  •  0
  • monstertjie_za  · 技术社区  · 4 年前

    IEqualityComparer 在匿名对象上自动实现。

    以下引自 here

    “C#编译器会覆盖匿名类型的Equals和GetHashCode。两个重写方法的实现使用类型上的所有公共属性来计算对象的哈希代码并测试是否相等。如果同一匿名类型的两个对象的属性值都相同,则对象相等。这是一种安全的策略,因为匿名类型的对象本质上是不可变的(所有属性都是只读的)。摆弄可变类型的哈希代码会有点冒险。”

    读完这篇文章后,我仍然收到我收藏中的副本。以下是我的LINQ查询:

    var calculations = (from dl in devianceLink.AsEnumerable()
                                join rec in receipts on new { TId = dl.PrimaryTransferId, EId = dl.EquipmentId } equals new { TId = rec.TransferId, EId = rec.EquipmentId } into recTemp
                                from rec in recTemp.DefaultIfEmpty().AsEnumerable()
                                join iss in issues on new { TId = dl.SecondaryTransferId, EId = dl.EquipmentId } equals new { TId = iss.TransferId, EId = iss.EquipmentId } into issTemp
                                from iss in issTemp.DefaultIfEmpty().AsEnumerable()
                                let partitionedByTransferLinkIdRec = devianceLink.Join(receipts, dl1 => dl1.PrimaryTransferId, rec1 => rec1.TransferId, (dl1, rec1) => new { DevianceLink = dl1, Receipts = rec1 }).Where(r => r.DevianceLink.TransferLinkId == dl.TransferLinkId).ToList()
                                let partitionedByTransferLinkIdIss = devianceLink.Join(issues, dl1 => dl1.SecondaryTransferId, iss1 => iss1.TransferId, (dl1, iss1) => new { DevianceLink = dl1, Issues = iss1 }).Where(r => r.DevianceLink.TransferLinkId == dl.TransferLinkId).ToList()
                                where   
                                    iss.EquipmentId != 0 && rec.EquipmentId != 0
                                select new 
                                {
                                    TransferLinkId = dl.TransferLinkId,
                                    ReceiptTransferId = dl.PrimaryTransferId,
                                    IssueTransferId = dl.SecondaryTransferId,
                                    ReceiptReversed = partitionedByTransferLinkIdRec.Any(r => r.Receipts.HasReversal.Value),
                                    ReceiptReversedPartial = partitionedByTransferLinkIdRec.Sum(r => r.Receipts.QuantityOri) - partitionedByTransferLinkIdRec.Sum(r => r.Receipts.QuantityRev) == 0 ? false : true,
                                    ReceiptCorrection = partitionedByTransferLinkIdRec.Any(r => r.Receipts.HasCorrection.Value),
                                    IssueReversed = partitionedByTransferLinkIdIss.Any(r => (bool)r.Issues.HasReversal),
                                    IssueReversedPartial = partitionedByTransferLinkIdIss.Sum(r => r.Issues.QuantityOri) - partitionedByTransferLinkIdIss.Sum(r => r.Issues.QuantityRev) == 0 ? false : true,
                                    IssueCorrection = partitionedByTransferLinkIdIss.Any(r => r.Issues.HasCorrection),
                                    DuplicateReceipt = dl.DuplicateReceipt,
                                    HasVariance = rec.Quantity - iss.Quantity == 0 ? false : true,
                                    EquipmentId = dl.EquipmentId,
                                    ReceiptCheckSum = 0,
                                    ReceiptQuantityOri = rec != null ? rec.QuantityOri : 0,
                                    ReceiptQuantityRev = rec != null ? rec.QuantityRev : 0,
                                    ReceiptQuantityCor = rec != null ? rec.QuantityCor : 0,
                                    ReceiptQuantity = rec != null ? rec.Quantity : 0,
                                    IssueCheckSum = 0,
                                    IssueQuantityOri = iss != null ? iss.QuantityOri.HasValue ? iss.QuantityOri : 0 : 0,
                                    IssueQuantityRev = iss != null ? iss.QuantityRev.HasValue ? iss.QuantityRev : 0 : 0,
                                    IssueQuantityCor = iss != null ? iss.QuantityCor.HasValue ? iss.QuantityCor : 0 : 0,
                                    IssueQuantity = iss != null ? iss.Quantity.HasValue ? iss.Quantity.Value : 0 : 0,
                                    Variance = (rec != null ? rec.Quantity : 0) - (iss != null ? iss.Quantity ?? 0 : 0),
                                    CreatedDate = DateTime.Now,
                                    UpdatedDate = DateTime.Now
                                }).ToList().Distinct();
    

    表的前两行 calculations

    { TransferLinkId = 1868649, ReceiptTransferId = , IssueTransferId = 44402996, ReceiptReversed = False, ReceiptReversedPartial = False, ReceiptCorrection = False, IssueReversed = False, IssueReversedPartial = True, IssueCorrection = False, DuplicateReceipt = False, HasVariance = True, EquipmentId = 8, ReceiptCheckSum = 0, ReceiptQuantityOri = 0, ReceiptQuantityRev = 0, ReceiptQuantityCor = 0, ReceiptQuantity = 0, IssueCheckSum = 0, IssueQuantityOri = 1, IssueQuantityRev = 0, IssueQuantityCor = 0, IssueQuantity = 1, Variance = -1, CreatedDate = 2021/08/14 21:43:25, UpdatedDate = 2021/08/14 21:43:25 }
    { TransferLinkId = 1868649, ReceiptTransferId = , IssueTransferId = 44402996, ReceiptReversed = False, ReceiptReversedPartial = False, ReceiptCorrection = False, IssueReversed = False, IssueReversedPartial = True, IssueCorrection = False, DuplicateReceipt = False, HasVariance = True, EquipmentId = 8, ReceiptCheckSum = 0, ReceiptQuantityOri = 0, ReceiptQuantityRev = 0, ReceiptQuantityCor = 0, ReceiptQuantity = 0, IssueCheckSum = 0, IssueQuantityOri = 1, IssueQuantityRev = 0, IssueQuantityCor = 0, IssueQuantity = 1, Variance = -1, CreatedDate = 2021/08/14 21:43:25, UpdatedDate = 2021/08/14 21:43:25 }
    

    .Distinct() call不会过滤掉这些内容。

    1 回复  |  直到 4 年前
        1
  •  3
  •   kiziu    4 年前

    DateTime.Now .Ticks ,他们会有所不同。

    我想你应该省点钱 在LINQ之前添加变量并使用它,以确保所有条目的变量相同。另一个选项是在之后将其添加到对象 .Distinct() .

    推荐文章