Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...

News

"WHERE IN" - Abfrage mit LINQ to SQL

Nach etwas probieren hatte ich dann heraus, wie ich mit LINQ to SQL einen "WHERE IN" - Abfrage bekommen:

List<string> tmpList = new List<string>();
foreach (Group group in user.Groups)
  tmpList.Add(Group.ShortName);
string[] tmpArr = tmpList.ToArray<string>();

var calendars = from cal in db.Calendars
                      where (tmpArr.Contains(cal.OWNER))
                      select cal;

Die Contains-Abfrage in der WHERE Bedingung erzeugt eine "WHERE IN"- Abfrage in dem Stil

([t0].[OWNER] IN (@p1, @p2, @p3, @p4))

Ganz einfach...
Man muss es nur wissen...
Bzw. jemand sollte es mal dokumentiert haben ;-)

Posted: Mittwoch, 30. April 2008 14:30 von Jürgen Gutsch
Abgelegt unter: , , , ,

Kommentare

ClaudiusCeteras sagte:

Das Replace sieht fehl am Platze aus.

Da eh Variablen( @p1, @p2, ...) erzeugt werden, hast Du mit SQL-Injection  kein Problem.

So wie es jetzt ist, werden Gruppen, die ein ' enthalten falsch verarbeitet.

Gruß

Claudius

# April 30, 2008 16:43

Jürgen Gutsch sagte:

Hallo Claudius,

Danke für deinen Kommentar :-)

Du hast recht. Das stammt noch aus der alten SQL Abfrage, die ich durch LINQ ersetzt habe.

Ist allerdings nicht relevant für das Beispiel der "WHERE IN"-Abfrage und ist zudem aus dem ursprünglichen Kontext gerissen. ;-)

Ich werde das aus diesem Beispiel entfernen, damit es nicht noch mehr Leute irritiert.

# April 30, 2008 17:01

jolli sagte:

ein interessanter Ansatz in diesem Zusammenhang kann sein, das Pferd von hinten zu satteln.

Durch die DBML Klassenstruktur kann man auch von der entfernteren Entität starten und sich durch die Properties durchselektieren.

Beispiel:

[code]

EntityB.EntitiesA.Select(a => a.EntityC).Distinct<EntityC>.AsQueryable<EntityC>();

[/code]

Übrigens: Im obrigen Beispiel ist eine Klammer zu wenig (tmpArr.Contains(cal.OWNER)  -->)

# Mai 3, 2008 19:12

Jürgen Gutsch sagte:

Hallo Jolli,

Danke für deinen Kommentar :-)

Das mit der Klammer habe ich korrigiert.

Dein Tip ist gut, war nur in meinem Fall nicht möglich, da die entfernteren Entität nicht in der DBML enthalten ist. Warum das so ist, ist eine andere Geschichte...

# Mai 5, 2008 17:40
Anonyme Kommentare sind nicht zugelassen