Hallo. Falls die Frage schonmal gestellt wurde, so bitte schlagt mich nicht, dann hab ich sie nämlich nicht gefunden 😃
Ich habe eine MySQL Tabelle auf der ich 2 unterschiedliche Abfragen mache.
Über einen String frage ich nun ab, welche Abfrage ausgeführt werden soll.
also "ist string = 'bla' dann führe abfrage1 aus, ist string = 'blubb' führe abfrage2 aus"
Ich möchte mit Linq To SQL nun das gleiche bei meinem DataSet durchführen.
Also die Linq To SQL Abfrage basierend auf der If Abfrage ändern.
also quasi sowas:
var qry = null; //funktioniert nicht, da hier initialisiert werden muss!
if (textVariable == "bla")
{
qry = from tbin ds.Tables[0].AsEnumerable()
select new
{
//irgendwas
};
}
else
{
qry = from tbin ds.Tables[0].AsEnumerable()
join ds.Tables[1].AsEnumerable() on
...
...
select new
{
//irgendwas ganz anderes
};
}
Leider funktioniert das so nicht, da ich der Nariable qry keinen typisierten Wert zuweisen darf / kann...
Ich habe was von Case Select Anweisungen in Linq To SQL gelesen aber weiß nicht wie diese funktionieren.
Kann mir hier jemand weiterhelfen?
Dank und Gruß
Afr0
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
soweitichweiß musst du nicht initialisieren, aber du mußt deklarieren (var geht hier nicht, weils eine Deklaration ist, die sich aus der Initialisierung ableitet)
IEnumerabls<DataRow> qry = null;
if (textVariable == "bla")
{
qry = from tbin ds.Tables[0].AsEnumerable()
select new
{
//irgendwas
};
}
else
{
qry = from tbin ds.Tables[0].AsEnumerable()
select new
{
//irgendwas ganz anderes
};
}
Achso - nee, du selectest ja je was ganz anderes.
Dann gehts nicht, weils 2 verschiedene Typen sind - die kannste natürlich nicht in dieselbe Variable stopfen.
Der frühe Apfel fängt den Wurm.
genau 😃
Fehler 1 Der Typ "System.Collections.Generic.IEnumerable<AnonymousType#1>" kann nicht implizit in "System.Collections.Generic.IEnumerable<System.Data.DataRow>" konvertiert werden.
vielleicht gibt es etwas in diese richtung:
var qry = from row in ds.Tables[0].AsEnumerable()
case textVariable.Equals("bla")
join row2 in ds.Tables[1].AsEnumerable()
on
.....
case textVariable.Equals("blubb")
//kein join
select new ...
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
Wenn Du doch eh ein AsEnumerable aufrufst, weißt Du doch, dass ein IEnumerable<T> zurückkommt.
Also nimm statt var einfach ein IEnumerable<T>, setz für T den korrekten Typ ein, und Du bist das Problem los.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Hallo Golo,
Wenn Du doch eh ein AsEnumerable aufrufst, weißt Du doch, dass ein IEnumerable<T> zurückkommt.
Also nimm statt var einfach ein IEnumerable<T>, setz für T den korrekten Typ ein, und Du bist das Problem los.
soweitichweiß musst du nicht initialisieren, aber du mußt deklarieren (var geht hier nicht, weils eine Deklaration ist, die sich aus der Initialisierung ableitet)
C#-Code:
IEnumerabls<DataRow> qry = null;
...Achso - nee, du selectest ja je was ganz anderes.
Dann gehts nicht, weils 2 verschiedene Typen sind - die kannste natürlich nicht in dieselbe Variable stopfen.
In dem Fall bekomme ich folgende Exception:
Fehler 1 Der Typ "System.Collections.Generic.IEnumerable<AnonymousType#1>" kann nicht implizit in "System.Collections.Generic.IEnumerable<System.Data.DataRow>" konvertiert werden.
Hab mich schon gefreut, dass es so einfach klappt. Aber dem ist wohl doch nicht so...
btw: die Exception wird bei "select new" geworfen...
welcher Typ entspricht denn AnonymousType#1? 😃
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
select new { }
Das in den geschweiften Klammern ist dein anonymer Typ. Wir wissen nicht, wie der aussieht. Der Compiler ebenfalls nicht - klar ist aber, dass es NICHT DataRow ist.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hallo Afrokalypse,
btw: die Exception wird bei "select new" geworfen...
welcher Typ entspricht denn AnonymousType#1? 😃 Ja der Typ ist anonym. Der hat keinen Namen. Wenn du mitnew { }
irgendwas erstellst, ist das ein anonymer Typ. Und der ist nunmal keine DataRow.
Wenn es geht, könntest du auch direkt eine DataRow erstellen.
Aber mal einen Schritt zurück: Welchen Zweck hat das Join genau? Denn in der Regel braucht man bei LINQ nie ein Join - sofern Fremdschlüssel ordentlich drin sind.
Gruß,
dN!3L
select new
{
tableItemArray = tbin.ItemArray; //object[]
}
Leider hilft mir IEnumerable<object[]> qry = null auch nichts da object[] auch kein AnonymousType ist.
@dN!3L:
ich mache 2 Abfragen auf unterschiedliche Datenbanken von unterschiedlichen Servern und hole mir so die Daten die ich brauche. Im Fall mit dem Join muss ich die Daten der beiden Server verbinden. Im Fall ohne Join ist das speziell auf eine Tabelle nicht möglich.
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
Hallo Afrokalypse
var qry = from row in ds.Tables[0].AsEnumerable() case textVariable.Equals("bla") join row2 in ds.Tables[1].AsEnumerable() on ..... case textVariable.Equals("blubb") //kein join select new ...
Meinst du vielleicht sowas?
List<int> master = new List<int>{ 1, 2, 3, 4, 5 };
List<int> child1 = new List<int>{ 1, 2, 3 };
List<int> child2 = new List<int>{ 3, 4, 5 };
bool useChild1 = true;
var ret = from i in master
join c in (useChild1 ? child1 : child2) on i equals c
select i;
var ret2 = from i in (useChild1 ? child1 : child2)
select i;
Grüße
Flo
Edit: Typo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+
Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
select new { tableItemArray = tbin.ItemArray; }
Leider hilft mir IEnumerable<object[]> qry = null auch nichts da object[] auch kein AnonymousType ist.
Du musst new
nicht nehmen!
select tbin.ItemArray;
ist dann ein IEnumerable<object[]>
Gruß,
dN!3L
BTW:
Ich möchte mit Linq To SQL nun das gleiche bei meinem DataSet durchführen. Ähm, das ist dann aber kein LINQ2SQL!
Ah 😃
das mit dem new wusste ich nicht. Genau da lag der Fehler.
mit select tbin; funktionierts.
Vielen Dank 😃
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
Wo dN!3L das schon erwähnt:
Linq To Datasets ist evtl mal eine Lesestunde wert 😉. Dann dürfte auch das Hantieren mit object aufhören.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
das mit dem new wusste ich nicht. Genau da lag der Fehler.
Man kann an der Stelle jedes beliebige Objekt zurückgeben. Also irgendein Property, einen anonymen Typen, einen bekannten Typen, Konstanten, was auch immer.
Gruß,
dN!3L
Anonyme Typen haltich eh für Müll.
Weil du kannst sie nicht als Parameter an eine andere Methode weiter-geben und -verarbeiten.
Du kannstse evtl. schnell mal in einem unstrukturiertem DGV anzeigen, aber dann kann kein User was damit tun (ausser angugge), weil du die Items aus der BindingSource nicht mehr herausholen kannst, weilde den Typ nicht benennen kannst (anonym halt 😜 ).
Der frühe Apfel fängt den Wurm.
Wo dN!3L das schon erwähnt:
> ist evtl mal eine Lesestunde wert 😉. Dann dürfte auch das Hantieren mit object aufhören.LaTino
Ich habe das hier Abfragen für mehrere Tabellen (LINQ to DataSet) überflogen und es damit auch versucht, meine Daten aus dem DataSet zu holen. Deshalb bin ich auch so an dem 'new' hängen geblieben 😃
Aber durchlesen werde ich es mir trotzdem noch mal.
Gruß
Afr0
Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.
😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]
Anonyme Typen haltich eh für Müll.
Nunja, andere würden dasselbe über Pauschalisierungen sagen. Sie sind ein Sprachkonstrukt, das einem manchmal das Leben leichter macht.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Also gut, differenzier ich ein bischen:
Man kann sie nur innerhalb einer Methode einsetzen, z.B. ZwischenErgebnissse komplizierterer Berechnungen kurz mal festzuhalten.
Wofür man sie alles nicht einsetzen kann, habichja schon gesagt.
Der frühe Apfel fängt den Wurm.