

Linq - dotaz na řešení problému
Ahoj,
prosil bych o radu.
Mám načtené v Linqu data. Problém je trošku složitější, proto se snažím uvádět jen to nejpodstatnější.
V Linqu zatím znám základy a toto se týká porovnávání dat.
Řekněme, že mám v Linqové proměnné načtenu následující tabulku dat:
917152976
A nyní dostanu další soubor - tedy "další" Linqovou proměnnou (tabulku):
565050002
Potřeboval bych navrhnout Linqový dotaz, který bude schopen porovnat tyto dvě proměnné navzájem podle následujících kriterií:
-Zjistit, co je nového (které položky přibyly)
-Zjistit, co ubylo (které položky už nejsou ve druhém souboru)
-Zjistit, u kterých položek se změnilo množství (tj. sloupeček délka)
na zákldadě předchozích bodů:
-Vytvořit třetí Linqovou proměnnou (tabulku), která bude obsahovat podle předchozích bodů:
-odmazané staré řádky, které v tabulce číslo jedna jsou navíc oproti tabulce dva.
-přidané nové řádky, které jsou v tabulce dva navíc
Věřím, že to není složité, jen se to snažím dobře a klidně i příliš podrobně popsat.
Prostě v další tabulce chybí "hadice" 101 a 102 a je tam jen navíc sklo a papir.
Děkuji za přečtení a případné návrhy.
A určitě to potřebuješ jedním dotazem?
Klidně to může být realizováno i více dotazy.
Hlavně abych se posunul k "cíli"
Zatím jsem zkončil u tohoto:
(využívám rozšíření CsvHelper)
Zkoušel jsem googlovat, ale máš pravdu v tom, že odpovědi na tento dotaz bývají spletité.
Ale fungovat to bude, jenom když vendor_mat_number bude jednoznačný identifikátor, což ve tvém případě není.
Výborně, upravil jsem to následně:
Program proběhne bez chyby, ale výsledný soubor diference.csv je prázdný.
Přitom očekávám, že bude obsahovat řádky s názvy sklo a papir, protože ty jsou ve druhém souboru navíc.
No a kde je problém? Seznam je prázdný, nebo je chyba v zápisu do souboru?
Seznam je prázdný. Respektive dotaz: records1L.Where(t => !records2L.Any(r => r.polozka == t.polozka)).ToList();
vrací nula záznamů
A obě prohledávané kolekce, to jest records1L a records2L obsahují každá 12 záznamů. Tam taky chyba není.
Jakého typu je "polozka" a je při načtení z CSV správně vyplněná?
Je typu string. Celá třída vypadá takto:
Všechny hodnoty "polozka" v obou sloupcích jsou vyplněny.
Porovnávám ty předložené soubory, tam to lze vidět.
Aha, no problém je minimálně v tom, že ten dotaz vrací položky, které jsou v prvním ale ne ve druhém souboru. Pokud to chceš obráceně, tak to musíš patřičně upravit.
Upravil jsem to takto, ale zase to vrací nesmyslně moc položek
Jak by to mělo vypadat tedy?
Smazal jsi vykřičník.
Ano. Ale records2L.Where(t => !records1L.Any(r => t.polozka == r.polozka)).ToList();
stejně vrací nula záznamů.
Mám pocit jakoby problém byl jinde. Zkoušel jsem i:
from c in records2L where !records1L.Any(w => w.polozka == c.polozka) select c;
což opět vrací nula záznamů. Asi jsme přehlédli nějakou jinou prkotinku.![]:(](https://static.poradna.net/images/smiley/evilworry.gif)
Tak nevím, mám tenhle testovací kód:
Který vypisuje:
Teda přesně to, co bych od toho očekával.
Jj. Díky moc.