Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - LINQ to SQL Dynamische Abfragen mit Unterabfragen


eraser_seb - Sa 31.03.12 17:12
Titel: LINQ to SQL Dynamische Abfragen mit Unterabfragen
Hallo leute,

Ich beschäftige mich schin ein paar tagen mit LINQ TO SQL aber habe noch so meine Probleme damit.

Ich will mir Dynamisch abfragen basteln.

Beispiel.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
Table<CTabelleDateien> tblDateien = Program.DatenbankVerbindung.GetTable<CTabelleDateien>();
            Table<CTabelleDateienSchlagworte> tblDateienSchlagworte = Program.DatenbankVerbindung.GetTable<CTabelleDateienSchlagworte>();

            var qDateien =
                from fDateien in tblDateien
                where fDateien.ArchivDSN == varArchiFDSN
                select new
                {
                    fDateien.DSN,
                    fDateien.ArchivDSN,
                    fDateien.Pfad,
                    fDateien.Name,
                    fDateien.BearbeitungsDatum,
                    fDateien.ErstellDatum,
                };
            
            if (sSchlagWort.Trim() != "")
            {    /*               
                 SELECT  * 
                 FROM Dateien 
                 WHERE ArchivDSN = @varArchiFDSN
                       AND DSN IN( SELECT DateienSchlagworte.DateienDSN 
                                   FROM DateienSchlagworte 
                                   WHERE Wort LIKE '%Text%'
                                 )              
                 */

            }


Die SQL Anweisung würe ich gern als Linq To Sql anweisungen umzuwandeln, bekomme es aber einfach nicht auf die reihe.
Kann mir jemand von euch mal helfen?

Danke


Th69 - So 01.04.12 11:46

Hallo eraser_seb,

eine SQL-'IN'-Anweisung wird in Linq2SQL andersherum mittels der Contains-Methode umgesetzt, d.h. aus "x IN y" wird:

C#-Quelltext
1:
where y.Contains(x)                    

s.a. http://wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql

Und auch die SQL-'LIKE'-Anweisung kannst du mittels folgender Methoden umsetzen:
- LIKE 'X%': value.StartsWith("X")
- LIKE '%X': value.EndsWith("X")
- LIKE '%X%': value.Contains("X")

Und dann noch mittels der Unterabfrage kombiniert, solle in etwa so aussehen (ungetestet):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
from fDatei in tblDateien
where fDatei.ArchivDSN == varArchiFDSN && 
      (from word in DateienSchlagworte
       where word.Contains("Text")
       select word).Contains(fDatei.DSN)
select new
{
  // ...
}

P.S. In der 'from'-Klausel sollte der Variablenname in Singular (Einzahl) benutzt werden, also 'fDatei' (anstatt 'fDateien') - da dies analog zu einer 'foreach ... in'-Schleife zu sehen ist.


eraser_seb - So 01.04.12 12:05

Danke schön.