2012-05-30 17 views
15

Ich arbeite an einem neuen Projekt, das Linq To SQL verwenden muss. Ich wurde gebeten, eine generische oder wiederverwendbare Klasse Linq to SQL zu erstellen, mit der gespeicherte Prozeduren ausgeführt werden können.Erstellen Sie wiederverwendbare Linq To SQL für gespeicherte Prozeduren

In ADO.Net wusste ich, wie dies in einer Reihe von vorbei genau das tun, was ich wollte auszuführen und ich in verschiedenen Saiten für jede Abfrage passieren konnte ich laufen müssen:

SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc 

ich kämpfen werde mit wie man etwas Ähnliches in Linq To SQL erstellt, wenn es überhaupt möglich ist. Ich habe eine .dbml Datei erstellt und meine gespeicherte Prozedur hinzugefügt. Als Ergebnis kann ich die Ergebnisse zurück, den Code unter Verwendung von:

public List<myResultsStoreProc> GetData(string connectName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.myResultsStoreProc(); 

    return query.ToList(); 
} 

Der Code funktioniert, aber sie wollen, dass ich ein Verfahren zu schaffen, die unabhängig von gespeicherten Prozedur zurückgeben werde ich es sagen laufen. Ich habe online gesucht und mit Kollegen darüber gesprochen und war nicht erfolgreich bei der Suche nach einer Möglichkeit, wiederverwendbare gespeicherte Proc-Klassen zu erstellen.

Gibt es eine Möglichkeit, eine wiederverwendbare Linq to SQL Klasse zu erstellen, um gespeicherte Procs auszuführen?

Edit:

Was ich suche ist, wenn es eine Möglichkeit, so etwas wie die folgenden zu tun ist?

public List<string> GetData(string connectName, string procedureName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.procedureName(); 

    return query.ToList(); 
} 

Ich habe die MSDN docs auf Linq To Sql prüft und diese die Tabelle in der IEnumerable zeigen:

IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName 
     from customer1 as c1, customer2 as c2 
     where c1.custid = c2.custid" 
); 

ich nach etwas suchen sehr allgemein gehalten, wo ich in einem String-Wert der gespeicherten schicken proc, dass ich ausführen möchte. Wenn dies nicht möglich ist, gibt es Unterlagen darüber, warum dies nicht möglich ist? Ich muss beweisen, warum wir nicht einen String-Wert des Namens des Verfahrens passieren kann in Linq To Sql

+0

Haben Sie gespeicherte Prozeduren ausführen müssen, die Sie in der .dbml Datei modelliert nicht haben kann? Und möchten Sie Entitäten zurückgeben, die in Ihrer .dbml zugeordnet sind? – CodingGorilla

+0

sie werden höchstwahrscheinlich in der .dbml zugeordnet werden, aber ich denke, es könnte einen Fall geben, wo es nicht – Taryn

+0

war Dies ist nicht die Art, wie LINQ to SQL verwendet werden soll. Sie arbeiten gegen das System. Versuchen Sie, so zu arbeiten, wie es verwendet werden soll. – usr

Antwort

16

DataContext.ExecuteCommand ist nicht ganz das, was Sie suchen, da es nur einen int-Wert zurückgibt. Stattdessen möchten Sie DataContext.ExecuteQuery, das eine gespeicherte Prozedur ausführen und ein Dataset zurückgeben kann.

Ich würde eine partielle Klasse für Ihre DBML erstellen, in der diese Funktion gespeichert wird.

public List<T> GetDataNoParams(string procname) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname); 

    return query.ToList(); 
} 

public List<T> GetDataParams(string procname, Object[] parameters) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname, parameters); 

    return query.ToList(); 
} 

eine gespeicherte Prozedur aufzurufen, die Sie tun würde:

GetDataNoParams("myprocedurename"); 

oder

GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345); 

oder

GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345); 

Wenn Sie möchten, ohne Rückgabewert Prozeduren aufzurufen, die ist auch einfach genug, wie ich sicher bin Sie können sehen, indem Sie eine neue Methode erstellen, die nichts speichert/zurückgibt.

Die Inspiration kam von http://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspx.

+0

Wird die DBML-Datei die 'ExecuteQuery ' Methode mitteilen, was 'T' ist, damit die Daten in Objektinstanzen zerlegt werden können? – bluevector

+0

Nein, du sagst es, wenn du es nennst. In meinen Beispielen wird davon ausgegangen, dass Sie den Rückgabetypen für jede gespeicherte Prozedur bereits Objekte zugeordnet haben. Wenn Sie also eine Stored Procedure haben, die Kunden zurückgibt und Sie einen Kundenobjekttyp haben, dann geben Sie Customer für T. – Peter

+0

Gotcha ein. Also versuchen wir nicht, "IQueryable" gespeicherte Procs und nichts muss allwissend sein. – bluevector

2

Die einfachste Antwort auf Ihre Frage auszuführen ist, dass Sie die Connection Eigentum Ihrer MyDataContext greifen und erstellen und führen Sie Ihre eigene SqlCommand s genau wie in ADO.Net. Ich bin mir nicht sicher, ob dies Ihren Zwecken dient, insbesondere wenn Sie Entitäten von Ihrem LINQ to SQL-Modell abrufen möchten.

Wenn Sie Entitäten aus dem Modell zurückgeben möchten, sehen Sie sich die Methode DataContext.ExecuteCommand an.

+0

Vielen Dank für die Richtung dafür, aber können Sie zusätzliche Informationen zur Verfügung stellen, wie ich eine Zeichenfolge mit dem Namen der Prozedur übergeben könnte, die ich ausführen möchte . – Taryn

+0

@bluefeet Sieh Peters Antwort, er hat ein paar anständige Beispiele. – CodingGorilla

0

Wenn wir eine Tabelle oder ein StoredProcedure in unserer .dbml-Datei löschen, erstellt sie ihre Klasse, die mit der Datenschicht und unserer Geschäftslogik kommuniziert.

In Linq to SQL müssen die StoredProcedures oder Tabellen in der .dbml-Datei vorhanden sein, andernfalls gibt es keine Möglichkeit, eine generische Methode in Linq to SQL aufzurufen, um eine gespeicherte Prozedur aufzurufen, indem der Name an eine Methode übergeben wird.

Aber in ADO.Net wir können es tun (wie Sie wissen)

SqlCommand cmd = new SqlCommand("myStoredProc", conn); 
Verwandte Themen