2013-04-14 13 views
6

W mojej bazie danych zdefiniowałem jakąś funkcję, załóżmy, że nazywa się fnTest. Czy można wywołać tę funkcję z mojego zapytania LINQ/EF? Coś takiego:Jak wywołać funkcję DB z zapytania EF LINQ?

var param3, param4; 
var res = (from x in db.Something 
      where x.field1 > 0 
      orderby fnTest(x.f1, x.f2, param3, param4) 
      select x).Take(20); 

Jak widać, muszę tę funkcję do wykonania po stronie DB bo muszę uporządkować dane przy użyciu wartości, że wraca. Pierwsze dwa parametry to pola z tabeli, a dwa kolejne to niektóre liczby, które zmienią się w programie, ale będą stałe dla każdego zapytania.

Czy można w jakiś sposób wywołać funkcję, która jest już utworzona w DB? Czy muszę użyć czegoś takiego:

((IObjectContextAdapter) context).ObjectContext.CreateQuery 

i napisać zapytanie ręcznie?

Odpowiedz

6

pierwsze, fnTest będą musiały być tworzone jako funkcji zdefiniowanej przez użytkownika w bazie danych pierwsze:

CREATE FUNCTION [fnTest] (@fi int, @f2 int, @param3 int, @param4 int) 
RETURNS int 
AS ... 

Następnie w pliku .edmx, zadeklarować funkcję tak :

<Function Name="fnTest" ReturnType="int" Schema="dbo" > 
    <Parameter Name="f1" Mode="In" Type="int" /> 
    <Parameter Name="f2" Mode="In" Type="int" /> 
    <Parameter Name="param3" Mode="In" Type="int" /> 
    <Parameter Name="param4" Mode="In" Type="int" /> 
</Function> 

teraz można powiązać tę funkcję do metody w modelu tak:

[EdmFunction("MyNamespace", "fnTest")] 
public static int fnTest(int f1, int f2, int param3, int param4) 
{ 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

Można teraz użyć tej metody w standardowych kwerendach LINQ.

Dalsze Reading

+0

dzięki, to jest dokładnie to, co chciałem! – xx77aBs

Powiązane problemy