7

私のデータベースでは、いくつかの関数を定義していますfnTest。LINQ/EF クエリからその関数を呼び出すことはできますか? このようなもの:

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);

ご覧のとおり、返される値を使用してデータを並べ替える必要があるため、DB 側でその関数を実行する必要があります。最初の 2 つのパラメーターはテーブルのフィールドで、次の 2 つのパラメーターはプログラムで変更される数値ですが、クエリごとに一定です。

DBですでに作成されている関数を何らかの方法で呼び出すことは可能ですか? または、次のようなものを使用する必要がありますか:

((IObjectContextAdapter) context).ObjectContext.CreateQuery

手動でクエリを記述しますか?

4

2 に答える 2

7

まず、fnTest最初にデータベースでユーザー定義関数として作成する必要があります。

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

次に、.edmx ファイルで、次のように関数を宣言します。

<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>

これで、この関数をモデルのメソッドに次のようにバインドできます。

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

このメソッドを標準の LINQ クエリで使用できるようになりました。

参考文献

于 2013-04-14T17:47:37.270 に答える
1

エンティティには SQL クエリを使用します。たとえば、msdn を参照してください: http://msdn.microsoft.com/en-us/data/jj592907.aspx

于 2013-04-14T17:40:59.910 に答える