[英]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.