web-dev-qa-db-ja.com

Entity Framework 4でユーザー定義関数を呼び出す

SQL Server 2005データベースにユーザー定義関数があり、少し返されます。 Entity Frameworkからこの関数を呼び出したいのですが。私は周りを探していて、あまり運がありませんでした。

LINQ to SQLではこれは非常に簡単でした。データコンテキストモデルに関数を追加するだけで、次のように呼び出すことができます。

bool result = FooContext.UserDefinedFunction(someParameter);

Entity Frameworkを使用して、モデルに関数を追加しました。モデルブラウザーのSomeModel.Store\Stored Proceduresに表示されます。

モデルは関数のコードを生成していません。edmxファイルのXMLには以下が含まれています。

<Function Name="UserDefinedFunction" ReturnType="bit" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <Parameter Name="someParameter" Type="int" Mode="In" />
</Function>

私が得ることができる最も近いものは次のようなものでした:

bool result = ObjectContext.ExecuteFunction<bool>(
    "UserDefinedFunction",
    new ObjectParameter("someParameter", someParameter)
).First();

しかし、次のエラーメッセージが表示されました。

FunctionImport 'UserDefinedFunction'がコンテナー 'FooEntities'で見つかりませんでした。

名前は無実を守るために変更されました。

tldr:Entity Framework 4.0を使用してスカラー値のユーザー定義関数を呼び出すにはどうすればよいですか?

21
Evil Pigeon

ようやく解決しました:Dスカラー関数の場合、FROM {1}句を追加できます。

bool result = FooContext.CreateQuery<bool>(
    "SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}",
    new ObjectParameter("someParameter", someParameter)
).First();

これは間違いなく、EFを介してLINQ to SQLを使用する場合に当てはまります。

23
Evil Pigeon

ユーザー定義の静的型SQL関数の呼び出し

ExecuteStoreQuery

  • 最初のパラメーターは、SQL関数呼び出しステートメントをストリング形式で受け取ります。
  • 2番目のパラメーターは、関数パラメーター名とその値を渡すSqlParameterクラスのオブジェクトを取ります。以下の方法に示すように
public  string GetNumberOFWorkDays(Guid leaveID)
{
  using (var ctx  = new INTERNAL_IntranetDemoEntities())
  {
    return ctx.ExecuteStoreQuery<string>(
                  "SELECT [dbo].[fnCalculateNumberOFWorkDays](@leaveID)",
                  new SqlParameter { ParameterName = "leaveID", Value = leaveID }
               ).FirstOrDefault();
   }
}
7
Sachin Verma

Entity Frameworkを介してMS SQLでテーブル値関数を呼び出したい場合;あなたはこれを使うことができます:

var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));
6
Oguzhan KIRCALI

ODPNETベータ2(Oracle)でEF4の関数を呼び出すと、NUMBERが返されます。

using (var db = new FooContext())
{
    var queryText = "SELECT FooModel.Store.MY_FUNC(@param) FROM {1}"
    var result = db.CreateQuery<DbDataRecord>(queryText,new ObjectParameter("param", paramvalue));
    return result.First().GetDecimal(0);
}

Evil Pigeonのコードに基づいてOracle用に理解できるため、ここに追加します。 (彼の答えも賛成した)。

4
Hoagie

ObjectResult result = context.ExecuteStoreQuery( "select EmployeeName from User where Id = {0}"、15);

http://msdn.Microsoft.com/en-us/library/ee358758.aspx

3
DipakRiswadkar

this が役立つかもしれません。 Linqを使用せずに、eSQLを介してのみ呼び出すことができるように見えます。

1
Ben Robinson

考えたidは、これに遭遇した他の誰かにメモを追加します。SQL関数パラメーターがnull可能である場合、パラメーター値「デフォルト」でSQLの関数を呼び出す必要があります。 Entity Framworkを使用してそのような関数を呼び出すには、

bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}"
).First();
0
Andy Mo