Give a try to following
Assign activity
leftSide: dt_new
right side:
(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = false
Select r=d).CopyToDataTable
@Krissey
With the interpretation that complete opposite means following:
filter rows where Any Col1,2,3 is Empty or 0
we can do:
(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = true
Select r=d).CopyToDataTable
Kindly note: CopyToDataTable is throwing by default an exception in case of empty filter result. We do handle this defensive with following pattern:
thank you very much, but the second expression did not work. There was no filtering.
Here is an example, for your understandig:
The first expression should give me the first result and the second expression should give me the second result. Is that possible?
No, that does not depend on the names. In my workflow i changed them to the right column names. But the second expression doesnt give me the second result, which i need. (See Picture as an example)
I think you are from munich. Do you speak german? If not, please ignore the following sentences:
Deine erste Abfrage liefert mir das richtige Ergebnis. (Wie auf dem Bild zu sehen ist)
Die zweite Abfrage jedoch leider nicht.
Habe dir als Beispiel mal ein Bild hochgeladen, was mir die beiden Abfragen als Ergebnis liefern sollen und wie die Ursprungstabelle aussieht. Die Spaltennamen habe ich übrigens richtig angepasst, daran kann es nicht liegen.
Danke schonmal
Erstes Ergebnis:
dt_neu1 = dt_alt wenn [(Spalte 1 nicht leer oder nicht 0 ist) und (Spalte 2 nicht leer oder nicht 0 ist) und (Spalte 3 nicht leer oder nicht 0 ist)] - Das passte ja soweit mit deiner Abfrage
Das zweite Ergebnis soll quasi die Schnittmenge aus dt_alt und dt_neu sein. Schwierig in Worte zu fassen, also quasi dt_neu2 = dt_alt - dt_neu1
und das liefert die zweite Abfrage aktuell nicht.
Vielleicht gibt es da auch eine andere Lösung?!
Vielen dank nochmal für deine Mühe
Wenn wir sagen: dt_Neu sind Zeilen bei denen
1 oder mehr Spalten von Col1,2,5 leer oder 0 sind, dann könnte u.g. LINQ Statement passen
(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = true
Select r=d).CopyToDataTable
also nach meinem Testen funktioniert: Expression1:
(From d in dtOld.AsEnumerable
Let check = {“Column1”,“Column2”,“Column3”}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals(“0”))
Where check = false
Select r=d).CopyToDataTable
+ Expression2:
dtOld.AsEnumerable.Except(dt_neu1.AsEnumerable, DataRowComparer.Default).CopyToDatatable
Mit den beiden zusammen habe ich die beiden gewünschten data tables. Was meinst du jetzt genau mit Duplikaten? Kann ich nicht einfach Duplikate entfernen nutzen?
Except ist ähnlich dem Minus (get the opposite) aber verschluckt Duplikate (siehe Beispiel 1, kommt ursprünglich mehrmals vor, nachdem Except aber nur noch einmal). Das sollte man beim Einsatz von Except immer im Hinterkopf behalten. aber mit den LINQ statements sind wir gut aufgestellt.
verhalten ist gleich wie bei der Liste (s.o. denke an den DataRowComparer)
das Ergebnis ist nicht eine gelöschte Liste, DataTable. Except gibt uns einfach das ermittelte Ergebnis zurück (als Except Default Rückgabedatentyp oder modifiziert mit z.B toList, ToArray…)
Die Duplikate (1 vom Listenbeispiel) werden auch verschluckt.