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を使用してスカラー値のユーザー定義関数を呼び出すにはどうすればよいですか?
ようやく解決しました: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を使用する場合に当てはまります。
ユーザー定義の静的型SQL関数の呼び出し
ExecuteStoreQuery
、
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();
}
}
Entity Frameworkを介してMS SQLでテーブル値関数を呼び出したい場合;あなたはこれを使うことができます:
var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));
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用に理解できるため、ここに追加します。 (彼の答えも賛成した)。
ObjectResult result = context.ExecuteStoreQuery( "select EmployeeName from User where Id = {0}"、15);
this が役立つかもしれません。 Linqを使用せずに、eSQLを介してのみ呼び出すことができるように見えます。
考えたidは、これに遭遇した他の誰かにメモを追加します。SQL関数パラメーターがnull可能である場合、パラメーター値「デフォルト」でSQLの関数を呼び出す必要があります。 Entity Framworkを使用してそのような関数を呼び出すには、
bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}"
).First();