Entity Frameworkコア - 未処理クエリのマッピング(IDなしのDTOクラス)、スカラー

c# dbcontext entity-framework entity-framework-core stored-procedures

質問

私はASPNETCoreでEFCoreを使用していますが、すばらしいことはありますが、次の2つの状況があります。

  1. 私は、データベース内のテーブルではないDTOクラスを作成しました。これらのクラスは、生のSQLクエリまたはプロシージャをマップします。

ここに文脈!

クラスDTO

だから私は、リストクラスのDTOでSQLプロシージャの結果をマップする必要があります.EFCoreでDTOのすべてのクラスにIDという名前のフィールドが必要な場合は質問があります。私のクエリがIDという名前のフィールドをマップする必要がないことをEFCoreに指定する方法があります。

rawQuery

リポジトリ

  1. 同様に、生のSQLクエリまたはプロシージャのスカラー値または一意の結果をマップする正しい方法は何ですか?

ご支援ありがとうございました。

人気のある回答

ここにあなたのニーズを解決するクラスがあります。

使用法var listOfEntity = DatabaseServices.ExecuteStoredProcedure(ストアドプロシージャ名、SqlParameterのリスト)

パブリッククラスDatabaseServices:IDatabaseServices {private読み取り専用ApplicationDbContext _applicationDbContext;

    public DatabaseServices(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    public List<T> ExecuteStoreProcedure<T>(string storedProcedure, List<SqlParameter> parameters) where T : new()
    {
        using (var cmd = _applicationDbContext.Database.GetDbConnection().CreateCommand())
        {
            cmd.CommandText = storedProcedure;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 300;

            // set some parameters of the stored procedure
            foreach (var parameter in parameters)
            {
                parameter.Value = parameter.Value ?? DBNull.Value;
                cmd.Parameters.Add(parameter);
            }

            if (cmd.Connection.State != ConnectionState.Open)
                cmd.Connection.Open();

            using (var dataReader = cmd.ExecuteReader())
            {
                var test = DataReaderMapToList<T>(dataReader);
                return test;
            }
        }
    }

    private static List<T> DataReaderMapToList<T>(DbDataReader dr)
    {
        List<T> list = new List<T>();

        if (dr.HasRows)
        {
            while (dr.Read())
            {
                var obj = Activator.CreateInstance<T>();
                foreach (PropertyInfo prop in obj.GetType().GetProperties())
                {
                    if (!Equals(dr[prop.Name], DBNull.Value))
                    {
                        prop.SetValue(obj, dr[prop.Name], null);
                    }
                }
                list.Add(obj);
            }
            return list;
        }
        return new List<T>();
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ