2010-11-23 5 views
5

Jungs Wie kann ich die folgendenAufruf von Funktionen in LINQ to SQL-NET 3.5

var productslist=from p in productsTable 
       select new product{Id=p.Id,Tax=myfunctions.calculateTax(p.price)}; 

erreichen ich versucht habe zu Google und kam in diesen document. Gibt es eine andere Art, wie ich dies tun können, ohne Dritte mit dlls

Lösung: Verschieben Anwendung 4.0 .net (dies tatsächlich unterstützen und funktionieren sollte). Nway ich steckte vorläufig auf die untenstehende Lösung

+0

Ist 'calculateTax' eine gespeicherte Prozedur/Funktion in der DB? – Gabe

+0

keine .it eine Funktion in meinem Code – lafama

+0

Überprüfen Sie den Link oben "Dokument" -Link. seine hat eine DLL, die u verwenden .ToExpandable() in der LINQ-Abfragen – lafama

Antwort

6

Versuchen Sie, eine lokale Funktion oder eine in der Datenbank aufzurufen? Wenn es sich um eine lokale Funktion und es ist das letzte, was Sie tun, es ist einfach - Sie müssen nur einen Anruf zu AsEnumerable() den Rest der Abfrage zu zwingen, lokal auszuführen:

var products = productsTable.AsEnumerable() 
          .Select(p => new Product 
            { p.Id, Tax = CalculateTax(p.Price) }); 
+0

Es ist eine lokale Funktionen. Bitte erläutern Sie, was Sie "der Emader der lokal auszuführenden Abfrage" sein soll. Ich dachte, es war möglich, dass die gesamte Abfrage auf dem db – lafama

+0

@lafama auszuführen: Nicht, wenn Sie lokalen Code auszuführen sind versucht, nein. Im Grunde zieht meine obige Version Daten aus der Datenbank herunter und ruft 'CalculateTax' auf jedem zurückgegebenen Datenstück auf. Wenn Sie möchten, dass die Steuerberechnung in der Datenbank ausgeführt wird, sollten Sie eine gespeicherte Prozedur oder UDF schreiben. –

+0

Meine einzige Anmerkung ist, dass dies unnötige Spalten holen könnte - aber da wir bereits ein 'where' vermissen, scheint das pingelig; p –

11

LINQ to SQL kann nicht magisch übersetzen beliebig C# zu TSQL; eine begrenzte Auswahl von häufig benötigten Syntax ist innerhalb LINQ zur Verfügung, aber eine C# Methode ist nicht zur Arbeit gehen.

Optionen:

  • die Funktion als UDF neu schreiben (in T-SQL) und die UDF, um Ihren Daten-Kontext zuordnen (das heißt die UDF auf die Designer-Oberfläche ziehen); verwenden myDataContext.MyUdf(args) in LINQ
  • anwenden, um Ihre Funktion nur, wenn die Daten in .NET-Land ist zurück
  • neu schreiben die Funktion als LINQ-Projektion

ich die mittlere Option erwarten ist die einfachste in Ihrem Szenario. Zum Beispiel:

var productslist= 
      (from p in productsTable 
      select new {Id=p.Id,p.price}).AsEnumerable() 
      .Select(p => new {p.Id, Tax=myfunctions.calculateTax(p.price)}); 

Die AsEnumerable() breaks "Komposition" - das heißt, es stoppt LINQ-to-SQL von dem Versuch calculateTax in Bezug auf TSQL zu verstehen; Nur die Id und price werden aus SQL abgerufen; dann wie es jede Reihe verarbeitet gilt es den zweiten Vorsprung die Steuer zu berechnen.