24

スカラー関数を .edmx にマップしたいのですが、失敗します。エンティティ フレームワーク マッピングを右クリックし、[データベースからモデルを更新] を選択します。モデル ブラウザーのストアド プロシージャ フォルダーに表示されます。

Function Importsしかし、モデル ブラウザのフォルダに追加しようとすると、ドロップダウン リストに「scalar function is not appear 」というメッセージが表示されます。誰かが私を助けることができますか?

次のように、古い方法を使用してスカラー関数を呼び出すことができます。

dbContext.ExecuteStoreQuery<DateTime?>(
"SELECT dbo.getMinActualLoadDate ({0}, {1}, {2}) AS MyResult", 
LoadPkid, LoadFkStartLoc, TripSheetPkid).First();

しかし、それは最善の方法ではありません。私のマネージャーは、スカラー関数を「関数インポート」フォルダーに配置できる方法を見つけて、前のコードの代わりに次のコードを使用してスカラー関数を呼び出すことができるようにすることを望んでいます。

dbContext.ExecuteFunction("getMinActualLoadDate ", paramList);

私が言いたいことを表示するために画像を追加しようとしましたが、評判がまだ低いため、追加できません。ただし、画像は次の場所にあります

ありがとう。

4

5 に答える 5

8

これは、この問題に対する私の解決策です。これは、18 か月遅れではありますが、マネージャーが求めていたものとほぼ同じです。

バニラメソッドとして:

    /// <summary>
    /// Calls a given Sql function and returns a singular value
    /// </summary>
    /// <param name="db">Current DbContext instance</param>
    /// <typeparam name="T">CLR Type</typeparam>
    /// <param name="sql">Sql function</param>
    /// <param name="parameters">Sql function parameters</param>
    /// <param name="schema">Owning schema</param>
    /// <returns>Value of T</returns>
    public T SqlScalarResult<T>(DbContext db, 
                                string sql, 
                                SqlParameter[] parameters,
                                string schema = "dbo") {

        if (string.IsNullOrEmpty(sql)) {
            throw new ArgumentException("function");
        }

        if (parameters == null || parameters.Length == 0) {
            throw new ArgumentException("parameters");
        }

        if (string.IsNullOrEmpty(schema)) {
            throw new ArgumentException("schema");
        }

        string cmdText =
            $@"SELECT {schema}.{sql}({string.Join(",",
                parameters.Select(p => "@" + p.ParameterName).ToList())});";

        // ReSharper disable once CoVariantArrayConversion
        return db.Database.SqlQuery<T>(cmdText, parameters).FirstOrDefault();

    }

}

そして、EF への拡張メソッドとして:

namespace System.Data.Entity {

    public static class DatabaseExtensions {

        /// <summary>
        /// Calls a given Sql function and returns a singular value
        /// </summary>
        /// <param name="db">Current DbContext instance</param>
        /// <typeparam name="T">CLR Type</typeparam>
        /// <param name="sql">Sql function</param>
        /// <param name="parameters">Sql function parameters</param>
        /// <param name="schema">Owning schema</param>
        /// <returns>Value of T</returns>
        public static T SqlScalarResult<T>(this Database db, 
                                           string sql, 
                                           SqlParameter[] parameters,
                                           string schema = "dbo") {

            if (string.IsNullOrEmpty(sql)) {
                throw new ArgumentException("sql");
            }

            if (parameters == null || parameters.Length == 0) {
                throw new ArgumentException("parameters");
            }

            if (string.IsNullOrEmpty(schema)) {
                throw new ArgumentException("schema");
            }

            string cmdText =
                $@"SELECT {schema}.{sql}({string.Join(",", 
                    parameters.Select(p => "@" + p.ParameterName).ToList())});";

            // ReSharper disable once CoVariantArrayConversion
            return db.SqlQuery<T>(cmdText, parameters).FirstOrDefault();

        }

    }

}

ここでは問題ありませんが、本格的に使用する前に単体テストを行うことをお勧めします。

于 2014-08-20T06:58:08.490 に答える
1

Complex TypesEdit Function Importを生成できるダイアログを見逃していると思います。探検してみてください。

ここに画像の説明を入力

が正常に作成された場合は、次のscalarsようにナビゲートできます。

using (var con = new DatabaseEntities())
{
   long? invoiceNo = con.sp_GetInvoiceMaxNumber(code.Length + 2).First();
   ....
}
于 2013-01-23T23:54:33.850 に答える