| 

.NET C# Java Javascript Exception

2
Bekanntlich wird folgende Abfrage:

var x = from p in ctx.Personen
where p.Name.StartsWith("golo")
select p;


in folgenden SQL-Code übersetzt:

select ...
from Personen
where Personen.Name like 'golo%'


Wie kann LINQ diese Übersetzung vornehmen, obwohl die Abfrage vom C#-Compiler in die Assembly einkompiliert wurde. Wird der IL-Code etwa zur Laufzeit ausgelesen und analysiert?
News:
19.08.2009
golo 181 2 5
2 Antworten
2
Die LINQ-Syntax wird vom Compiler in Aufrufe der Erweiterungsmethoden übersetzt. Somit ist die obige Beispielabfrage nach dem Kompilieren (das var hab ich mal einfachheitshalber gelassen - wird aber in den entsprchenden Typ übersetzt):
var x = ctx.Person.Where(p => p.Name.StartsWith("golo"));

Da hier LINQ to SQL verwendet wird erwartet die Erweiterungsmehtode als Parameter einen Expression-Tree (Ausdrucksbaum). Dieser Ausdrucksbaum wird als Lambda-Ausdruck angegeben. Zur Laufzeit kann die LINQ to SQL-Runtime diesen Ausdrucksbaum auswerten und entsprechend in eine Zielsprache (hier SQL) übersetzen.

Siehe auch: LINQ Compiled Query
19.08.2009
gfoidl 9,4k 3 5
0
Seit C# 3.0 kann der Compiler Code nicht nur in IL übersetzen. Bei Linq to xxx erzeugt er statt dessen eine Objektstruktur im Speicher, die dem C# Code entspricht (den erwähnten Expression Tree).

Du kannst dir einen Expression Tree für C# Code vorstellen wie XML DOM für XML Code. Frameworks wie Linq2SQL oder Linq2Entities untersuchen den Expression Tree zur Laufzeit und übersetzen ihn z.B. in SQL. Treffen Sie im Expression Tree beispielsweise auf einen Call-Knoten und die aufgerufene Methode ist String.StartsWith, generieren sie Dinge wie LIKE.

Wirf einen Blick auf die Klasse System.Linq.Expressions.Expression. Dort siehst du, woraus Expression Trees bestehen können.

PS.: Mit C# 4 und DLR gewinnt das Konzept von Expression Trees noch weiter an Bedeutung. Einlesen schadet also langfristig nichts.
07.09.2009
r.stropek 91 1 1
Der Compiler erzeugt trotzdem "nur" IL-Code. Die Objektstruktur wird während der Programmausführung erstellt. Würde sie bei der Kompilation erstellt so wäre die Objektstruktur zB nach einem Neustart weg.
gfoidl 07.09.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH