LINQ to DataSet zeigt nicht alle Datensätze!?

Gotenks

Mitglied
Hallo :)

zuerst einmal was ich benutze:
-SQL 2008
-Visual C#10

So also ich bin gerade dabei zwei verschiedene Tabellen aus zwei verschiedenen Datenbanken in ein DataSet zu packen, dass ist bis jetzt kein problem.
2 Datatables erstellt und einfach in DataSet gepackt :D

Nun wollte ich diese beiden Tabellen in eine Relation setzen, das habe ich mittels LINQ gemacht.
Linq hat ja fast die selben Anweisungen, wie bei SQL, deswegen habe ich diesen weg gewählt :D

DOCH jetzet kommt der Streitpunkt.
Wenn ich bei SQL 2008 Server Manager meine SQL anweisung benutze, läuft alles PIKOBELLO :D

SQL ANWEISUNG(CODE)
Code:
select	 [nvarch1] AS KNummer
		,[sql_variant1] AS VWZ
		,[float1] AS Betrag
		,[datetime1] AS Datum
		,[int1] AS fa
		,[nvarchar2] AS Art
		,[sql_variant2] AS [VWZ 2]
		,[Nummer]		
		,[Leitzahl]
		,[Name]
		
 from
	[DatenbankA].[dbo].[Kunden]
 left JOIN 
	([DatenbankB].[dbo].[Adressen]
		inner JOIN 
		[DatenbankB].[dbo].[Kontodaten]
		ON(Adressen.AkID = Kontodaten.AkID))
 on(DatenbankA.nvarchar1 = Adressen.ANummer Collate SQL_Latin1_General_CP1_CI_AS) // das muss ich so machen mit Collate sonst gibt es fehler :)
 
  where Adressen.ANummer LIKE '7%%%%' OR Adressen.ANummer LIKE '8%%%%' 
  order by Adressen.ANummer
So zeigt er alles an:D

C# (Code)
Code:
DataSet result = new DataSet();
            A_dataAdapter.Fill(result, "A");
            B_dataAdapter.Fill(result, "B");
            DataTable A_DT = result.Tables[0];
            DataTable B_DT = result.Tables[1];

            var innerjoin = from a in A_DT.AsEnumerable()
                            join b in B_DT.AsEnumerable() 
                            on a["KNummer"] equals b["ANummer"]
                            orderby a["KNummer"]
                            select new
                            {
                                KNummer = w["KNummer"],
                                VWZ = w["VWZ"],
                                Betrag = w["Betrag"],
                                Datum = w["Datum"],
                                fa = w["fa"],
                                Art = w["Art"],
                                VWZ2 = w["VWZ 2"],
                                Nummer = a["Nummer"],
                                Leitzahl = a["Leitzahl"],
                                Name = a["Name"],
                                ANummer = a["ANummer"]
                            };


            dataGridView1.DataSource = innerjoin.ToList();

Doch hier zeigt er nicht alles an, woran liegt dass ?
Warum zeigt er das in C# weniger an?
 

Gotenks

Mitglied
Hi

Weil du in Sql einen Left- über LINQ aber einen INNER-Join machst?!

Okay habe es bei der SQL Anweisung auch zweimal zu INNER-Join gemacht sodass er nur eine begrenzte anzahl dort anzeigt, aber bei C# zeigt er nun GARKEIN datensatz an :/

Ich zeig dir mal mein C# Code für den SQl DataAdapter(dieser kommt VOR dem DataSet = result):
Code:
SqlConnection A_Conn = new SqlConnection(AconStr);
SqlDataAdapter A_dataAdapter = new SqlDataAdapter("Select nvarchar15 as KNummer, sql_variant1 as VWZ,float1 as Betrag,datetime1 as Datum,int1 as fa,nvarchar2 as Art,sql_variant2 as [VWZ 2] FROM Kunden WHERE nvarchar1 LIKE '7%%%%' OR nvarchar1 LIKE '8%%%%'", A_Conn);

SqlConnection B_Conn = new SqlConnection(BconStr);
SqlDataAdapter B_dataAdapter = new SqlDataAdapter("Select a.ANummer,k.Leitzahl,k.Name, k.Nummer FROM Adressen a INNER JOIN Kontodaten k ON(a.AdressenID = k.AdressenID)", B_Conn);

Bei der zweiten SQL DataAdapter habe ich ja schon eine Inner join und bei LINQ to Dataset, setze ich einfach nvarchar1(KNummer) equels ANummmer, doch wenn ich das mittels:
Code:
dataGridView1.datasource = innerjoin.ToList();
angebe bleibt das datagridview LEER man zieht zwar die Spalten namen, aber sonst keine weitere Zeile :(

EDIT: Ich denke immer, wenn er mir nichts im DataGridView anzeigt ist es der richtige Code für das, was ich will weil alles andere zeigt er an wenn ich aber den Code verändere, sodass er "RICHTIG" ist, zeigt das dataGridView nix mehr an :/... Woran kann das liegen habe mittlerweile alles ausprobiert :/
habe sogar die KONTO-Datensätze in eine seperate DataTable gemacht und alles per Hand in C# zusammen codiert, aber auch GARKEIN erfolg :(

Bis jetzt schaffe ich es, dass er mir was anzeigt, aber es ist falsch, er zeigt einfach alles an nebeneinander ohne relation :'(

Ich hoffe jemand kann mir noch helfen...

EDIT2: muss ich vileicht bei der datasource auf irgendwas achten ?
ich kann sobald ich innerjoi. angebe, nur ToList() auswählen, punkte wie AsDataView oder CopyToDatatable kann cih nicht wählen :(

EDIT3: Kann gecloed werden hat sich erledigt :D
 
Zuletzt bearbeitet:

Gotenks

Mitglied
Ja Gerne :D

Also ich wollte ja zwei DataTables miteinander Verbinden(die aus unterschiedlichen Database stammen), das eine DataTable war schon mit einer Innerjoin(SqlDataAdapter) mit zwei tabellen aus der Datenbank verbunden.

Nun habe ich mit LINQ to DataSet gearbeitet:
Das ist der überarbeitet Code, der beide Datatables miteinander Verbindet, er zeigt uns nur die Werte an die auch eine Rechte-Seite haben, weil es Ja Innerjoins sind, also wenn die Rechte-Seite null-Values hat werden diese Datensätze NICHT angezeigt.
Code:
DataSet result = new DataSet();

//weiß nicht ob das von großer relevanz ist, habe ich einfach auch rein gehauen.
A_dataAdapter.FillSchema(result, SchemaType.Source, "A");
B_dataAdapter.FillSchema(result, SchemaType.Source, "B");
A_dataAdapter.Fill(result, "A");       
B_dataAdapter.Fill(result, "B");

DataTable A_DT = result.Tables[0];
DataTable B_DT = result.Tables[1];
 
var a_join_b =   from a in A_DT.AsEnumerable()
                        join b in B_DT.AsEnumerable() 
                        on Convert.ToInt32(a["KNummer"]) equals Convert.ToInt32(b["ANummer"])
                        select new
                        {
                            KNummer = w["KNummer"],
                            VWZ = w["VWZ"],
                            Betrag = w["Betrag"],
                            Datum = w["Datum"],
                            fa = w["fa"],
                            Art = w["Art"],
                            VWZ2 = w["VWZ 2"],
                            Nummer = a["Nummer"],
                            Leitzahl = a["Leitzahl"],
                            Name = a["Name"],
                            ANummer = a["ANummer"]
                          };
 
 
            dataGridView1.DataSource = innerjoin.ToList();

Das wars eigentlich xD...
Nun zeigt auch das DataGridView das an was ich wollte :)

Hoffe dieser Code hilft auch weiteren User/Leser :)

Achja und für die jenigen die versuchen die CopyToDataTable-Methode zu benutzen, kann ich euch sagen, das es bei select new{}; nicht funktonieren wird. Nur wenn ihr select (was ihr wolllt); benutzt, doch bei dieser variante, hat man kein Freiraum. Mit select new, erstellt man seine eigene Induviduelle tabelle :)
 
Zuletzt bearbeitet: