2009-02-27 16 views
6

Wie kann ich den Klassennamen des Ergebnisses der gespeicherten Prozedur ändern, das von LINQ an SQL-Designer generiert wird (abgesehen von messing mit Designer.cs)?LINQ to SQL: Stored Procedure-Ergebnisse

Wie können Sie eine Linq-Abfrage für die Ergebnismenge der gespeicherten Prozedur ausführen?

+0

Ein hilfreicher Artikel: http://blog.benhall.me.uk/2008/05/linq-to-sql-stored-procedure-vs.html –

Antwort

7

Können Sie dies in der dbml bearbeiten? Persönlich neige ich dazu, die automatisch generierten Typen zu behandeln (von Funktionen und gespeicherte Prozeduren) als DTOs, die auf den DAL lokal sind, so dass ich sofort wieder ordnet sie zu meiner eigenen Darstellung POCO - also

var qry = from row in ctx.SomeProc(12345) 
      select new Foo {ID = row.ID, Name = row.Name }; 

usw. Zur zweiten Frage "Wie können Sie eine linq-Abfrage für die Ergebnismenge der gespeicherten Prozedur durchführen?" - Ich würde empfehlen, eine benutzerdefinierte Funktion statt einer gespeicherten Prozedur verwenden, wenn Sie es komponieren wollen: das Ihnen die Zusammensetzung bei der Datenbank erlaubt, zu tun, zum Beispiel Paging und Filtern:

var qry = (from row in ctx.SomeFunction(12345) 
      where row.IsActive 
      select row).Skip(10).Take(10); 

welche soll (in LINQ-to -SQL mindestens) alles in TSQL auf dem Server tun. Andernfalls können Sie AsEnumerable() aufrufen und verwenden LINQ-to-Objects bei dem rufenden .NET Schicht:

var qry = (from row in ctx.SomeProc(12345).AsEnumerable() 
      where row.IsActive 
      select row).Skip(10).Take(10); 

Um die dbml zu bearbeiten (das ist nur xml), ändert sich die ElementType/@Name hier:

<Function Name="dbo.CustOrderHist" Method="CustOrderHist"> 
    <Parameter Name="CustomerID" Parameter="customerID" Type="System.String" DbType="NChar(5)" /> 
    <ElementType Name="FooBar"> <!-- ********** HERE ************ --> 
     <Column Name="ProductName" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" /> 
     <Column Name="Total" Type="System.Int32" DbType="Int" CanBeNull="true" /> 
    </ElementType> 
</Function> 
+0

Ah! richtig - ich habe eine "select row" verpasst; behoben –

+0

DOH! Sie wissen, was Ihnen bei der Arbeit mit LINQ wirklich hilft? Verwenden von System.Linq; –

2

Auch, wie können Sie eine Linq-Abfrage auf der Ergebnismenge der gespeicherten Verfahren durchführen?

var query = from results in datacontext.storedprocedurename() 
      where results.whatever == 1 
      select results;