Laden...

If Abfrage soll Linq To SQL ändern

Erstellt von Afrokalypse vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.736 Views
A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren
If Abfrage soll Linq To SQL ändern

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 =]

5.299 Beiträge seit 2008
vor 14 Jahren

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.

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren

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 =]

4.207 Beiträge seit 2003
vor 14 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren

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 =]

3.003 Beiträge seit 2006
vor 14 Jahren

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)

2.891 Beiträge seit 2004
vor 14 Jahren

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 mit new { } 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

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren

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 =]

1.564 Beiträge seit 2007
vor 14 Jahren

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ß.

2.891 Beiträge seit 2004
vor 14 Jahren
  
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!

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren

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 =]

3.003 Beiträge seit 2006
vor 14 Jahren

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)

2.891 Beiträge seit 2004
vor 14 Jahren

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

5.299 Beiträge seit 2008
vor 14 Jahren

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.

A
Afrokalypse Themenstarter:in
452 Beiträge seit 2005
vor 14 Jahren

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 =]

3.003 Beiträge seit 2006
vor 14 Jahren

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)

5.299 Beiträge seit 2008
vor 14 Jahren

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.