LINQ für eine DataTable in einer CLR-gespeicherten Prozedur

8

weiß jemand, ob es möglich ist (und wie), LINQ auf einer DataTable in einer CLR Stored Procedure zu verwenden?

Ich habe keine Probleme mit LINQ auf einer DataTable in einem Standard-WinForms-Projekt; Ich verwende ein Datenbankprojekt in VS2010 auf SQL2005 und eine Stored Procedure erstellen:

(vereinfachte Auflistung)

%Vor%

Das Problem ist, AsEnumerable () ist eine Erweiterungsmethode und obwohl ich mit Verweis auf LINQ habe; es wird immer noch nicht gefunden.

Die Suche nach Google hat mich dazu gebracht zu glauben, dass dies mit der Verwendung einer LINQ-Entity-Referenz (DLL) im Framework zu tun hat. Da es sich um ein DB-Projekt handelt, können wir keine Referenzen zu DLLs hinzufügen System; Das Feld zum Hinzufügen von Referenzen ist auf einige ausgewählte Assemblys beschränkt und es gibt keine Schaltfläche browse ... .

Unabhängig von Leistungsproblemen möchte ich nicht, dass viele ADO / T-SQL-Dateien in meinem .NET Stored-Prozess von Hand ablegt; Ich bevorzuge LINQ und die Möglichkeit, den Code auf verschiedene Ebenen / DB-Plattformen zu verschieben. Wird LINQ auf einer DataTable in einem Stored Proc unterstützt (rate ich nicht) oder bin ich hier komplett von der Basis entfernt und muss mit T-SQL codieren?

    
Alan Barker 06.07.2010, 04:50
quelle

1 Antwort

5

Ich bin mir nicht sicher, ob Sie den ganzen Weg dorthin bekommen, aber dies wird System.Data.DataSetExtensions in SQL Server 2008 installiert, damit Sie es von Ihrem SQL CLR-Projekt aus referenzieren können. Beachten Sie, dass ich als Mitglied der festen Serverrolle sysadmin angemeldet war.

Zuerst musste ich die Datenbank vorbereiten, um die unsichere Assembly zu laden. Ich habe ALTER DATABASE dbname SET TRUSTWORTHY ON; ausgeführt und dann den Besitzer der Datenbank auf sa mit ALTER AUTHORIZATION ON database::dbname TO sa; gesetzt.

Als Nächstes habe ich v3.5 der Assembly aus dem GAC auf meiner Workstation extrahiert, indem ich die Datei in ein Halteverzeichnis (zB c: \ temp) von C: \ Windows \ assembly \ GAC_MSIL \ System.Data.DataSetExtensions \ kopiert habe. 3.5.0.0__b77a5c561934e089.

Ich konnte dann die Assembly mit der Anweisung CREATE ASSEMBLY [System.Data.DataSetExtensions] FROM 'C:\temp\System.Data.DataSetExtensions.dll' WITH PERMISSION_SET = UNSAFE; installieren.

Sie erhalten diese freundliche Erinnerung, wenn die Anweisung abgeschlossen ist: Warnung: Die Microsoft .NET Framework-Assembly 'system.data.datasetextensions, Version = 3.5.0.0, culture = neutral, publickeytoken = b77a5c561934e089, processorarchitecture = msil . " Ihre Registrierung wird in der von SQL Server gehosteten Umgebung nicht vollständig getestet und wird nicht unterstützt. Wenn Sie in der Zukunft diese Assembly oder das .NET Framework aktualisieren oder warten, funktioniert Ihre CLR-Integrationsroutine möglicherweise nicht mehr. Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation.

An diesem Punkt konnte ich dann System.Data.DataSetExtensions in meinem SQL CLR-Projekt referenzieren und ich bestätigte, dass AsEnumerable() in der DataTable-Instanz angezeigt wurde.

    
arcain 30.12.2010, 06:12
quelle

Tags und Links