簡體   English   中英

匿名 object 上的 Distinct() 在 LINQ 中不起作用

[英]Distinct() on anonymous object not working in LINQ

我讀過IEqualityComparer是在匿名對象上自動實現的。

下面引用自這里

“事實證明,C# 編譯器為匿名類型覆蓋了 Equals 和 GetHashCode。這兩個覆蓋方法的實現使用該類型的所有公共屬性來計算對象的 hash 代碼並測試是否相等。如果相同匿名類型的兩個對象具有所有它們的屬性具有相同的值——對象是相等的。這是一個安全的策略,因為匿名類型的對象本質上是不可變的(所有屬性都是只讀的)。擺弄可變類型的 hash 代碼有點冒險。”

讀完這篇文章后,我的收藏中仍然收到副本。 下面是我的 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()調用不會過濾掉這些。

我錯過了什么嗎?

您正在使用DateTime.Now創建/更新,因此條目之間的值不太可能相同,它們很可能相差幾分之一毫秒。 如果您以更高的精度顯示值,例如。 .Ticks ,它們會有所不同。

我認為您應該將DateTime.Now保存到 LINQ 之前的變量並使用它,以確保所有條目都相同。 另一種選擇是將其添加到 object 之后.Distinct()

暫無
暫無

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

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