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不会过滤掉这些内容。