Я придерживаюсь неуклюжего подхода, пока никто не знает лучшего способа. Просто сравните их снова и покажите только те значения, которые отличаются, иначе «равны».
Public Shared Sub CheckRmaMemoryInSyncWithDB()
Dim inSyncText As String
Dim color As Drawing.Color
Dim isInSync As Boolean
Dim daRma As New ERPModel.dsRMATableAdapters.RMATableAdapter
Dim tblRma = daRma.GetData()
Dim memory = (From rma In dsRMA.RMA
Where Not rma.IsfiChargeNull
Select rma.IdRMA, rma.fiCharge, rma.IMEI, rma.RMA_Number, rma.ModelID, rma.fiCustomer, SI_DPY = If(rma.IsSI_DPYNull, String.Empty, rma.SI_DPY), rma.fiStatus, rma.HasErrors).ToList
Dim dataBase = (From rma In tblRma
Where Not rma.IsfiChargeNull
Select rma.IdRMA, rma.fiCharge, rma.IMEI, rma.RMA_Number, rma.ModelID, rma.fiCustomer, SI_DPY = If(rma.IsSI_DPYNull, String.Empty, rma.SI_DPY), rma.fiStatus, rma.HasErrors).ToList
Dim memoryDiff = memory.Except(dataBase).ToList
Dim databaseDiff = dataBase.Except(memory).ToList
If memoryDiff.Any OrElse databaseDiff.Any Then
isInSync = False
inSyncText = "Database and Memory are NOT in Sync! Error-Log created."
Dim ex As New Exception("Database and Memory are NOT in Sync!")
Dim errInfo As String = String.Empty
'following joins both sequences to detect differences
'note: completely missing RMA's will be detected later
Dim diff = From rmaMem In memoryDiff
Join rmaDB In databaseDiff
On rmaMem.IdRMA Equals rmaDB.IdRMA
Select rmaDB.IdRMA _
, fiCharge = If(rmaMem.fiCharge = rmaDB.fiCharge, "equal", String.Format("{0}/{1}", rmaMem.fiCharge, rmaDB.fiCharge)) _
, IMEI = If(rmaMem.IMEI = rmaDB.IMEI, "equal", String.Format("{0}/{1}", rmaMem.IMEI, rmaDB.IMEI)) _
, RMA_Number = If(rmaMem.RMA_Number = rmaDB.RMA_Number, "equal", String.Format("{0}/{1}", rmaMem.RMA_Number, rmaDB.RMA_Number)) _
, ModelID = If(rmaMem.ModelID = rmaDB.ModelID, "equal", String.Format("{0}/{1}", rmaMem.ModelID, rmaDB.ModelID)) _
, fiCustomer = If(rmaMem.fiCustomer = rmaDB.fiCustomer, "equal", String.Format("{0}/{1}", rmaMem.fiCustomer, rmaDB.fiCustomer)) _
, SI_DPY = If(rmaMem.SI_DPY = rmaDB.SI_DPY, "equal", String.Format("{0}/{1}", rmaMem.SI_DPY, rmaDB.SI_DPY)) _
, fiStatus = If(rmaMem.fiStatus = rmaDB.fiStatus, "equal", String.Format("{0}/{1}", rmaMem.fiStatus, rmaDB.fiStatus)) _
, HasErrors = If(rmaMem.HasErrors = rmaDB.HasErrors, "equal", String.Format("{0}/{1}", rmaMem.HasErrors, rmaDB.HasErrors))
If diff.Any Then
errInfo &= "Differences(memory/database):" & Environment.NewLine
errInfo &= String.Join(Environment.NewLine, diff) & Environment.NewLine
End If
Dim memoryIDs = (From rma In memory
Select rma.IdRMA).ToList
Dim databaseIDs = (From rma In dataBase
Select rma.IdRMA).ToList
Dim missingInMemory = databaseIDs.Except(memoryIDs)
Dim missingInDB = memoryIDs.Except(databaseIDs)
If missingInMemory.Any Then
Dim rmaInfo = From rma In dataBase
Join idRMA In missingInMemory
On idRMA Equals rma.IdRMA
Select rma
errInfo &= "Missing RMA's in memory:" & Environment.NewLine
errInfo &= String.Join(Environment.NewLine, rmaInfo) & Environment.NewLine
End If
If missingInDB.Any Then
Dim rmaInfo = From rma In memory
Join idRMA In missingInDB
On idRMA Equals rma.IdRMA
Select rma
errInfo &= "Missing RMA's in database:" & Environment.NewLine
errInfo &= String.Join(Environment.NewLine, rmaInfo)
End If
ErrorLog.WriteError(ex, errInfo)
Else
isInSync = True
inSyncText = "Database and Memory are in Sync, all RMA's are identical in both."
End If
Dim master = DirectCast(DirectCast(HttpContext.Current.CurrentHandler, Page).Master, ERPMaster)
color = If(isInSync, Drawing.Color.Green, Drawing.Color.Red)
master.showStatusMessage(inSyncText, True, color)
End Sub
Создает следующий примерный вывод:
Differences(memory/database):
{ IdRMA = 25878, fiCharge = equal, IMEI = equal, RMA_Number = equal, ModelID = equal, fiCustomer = equal, SI_DPY = 1207-1104/1206-1105, fiStatus = equal, HasErrors = equal }
Missing RMA's in database:
{ IdRMA = 25882, fiCharge = 1416, IMEI = 004401076362330, RMA_Number = RMA0022725, ModelID = 449, fiCustomer = 49, SI_DPY = , fiStatus = 17, HasErrors = False }
{ IdRMA = 25881, fiCharge = 1416, IMEI = 359419030480338, RMA_Number = RMA0022724, ModelID = 758, fiCustomer = 49, SI_DPY = 1207-1124, fiStatus = 18, HasErrors = False }
Кстати, это кажущееся несоответствие было легко вызвать. Запустите приложение в VisualStudio (Cassini) параллельно производственному серверу и удалите / создайте несколько тестовых записей или измените некоторые значения здесь и там.