簡體   English   中英

使用實體框架到 Map Function 結果到 Object

[英]Use Entity Framework to Map Function Result to Object

我有一個.Net Core 應用程序,它使用 Postgresql 數據庫中存儲的 function 。 我將 Entity Framework Core 用於所有數據庫操作。

我正在考慮將存儲函數用於我的一些操作,但在將 function 的結果轉換為 object 時遇到問題。

我有一個 function,我想在幾個地方使用它,所以我希望它與我稱為 RawSql 的通用對象一起工作。

     public int RawSql<T>(string script, DbContext context, out object result)
{
    int returnValue = 0;

    result = null;


    using (var connection = context.Database.GetDbConnection())
    {

        if (script.ToUpperInvariant().StartsWith("SELECT", StringComparison.Ordinal))
        {
            try
            {
                connection.Open();

                DbCommand command = connection.CreateCommand();
                command.CommandText = script;
                command.CommandType = CommandType.Text;

                result = new List<DbDataReader>();

                DbDataReader reader = command.ExecuteReader();
                var output = new List<Object>();
                var test = reader.FieldCount;

                while (reader.Read())
                {
                    (result as List<DbDataReader>).Add(reader);

                    output.Add(new { value1 = reader[0], value2 = reader[1] });

                    Console.WriteLine("{0}. {1}", reader[0], reader[1]);
                }
            }
            catch (DbException exDb)
            {
            }
        }
    }
}

output object 是用從我的 select 語句返回的前兩列構建和填充的。 但是,並非我的所有查詢都會返回兩行,有些會或多或少。

如何將 Function 的結果綁定到通用 model?

幾點:

  1. 您應該創建一個具體類型來返回您的數據,而不是使用object 您的方法真的很難維護,並且讓潛在用戶感到困惑,因為不知道究竟返回了哪些數據。

  2. 你不在方法中的任何地方使用泛型參數 T 並且你不返回任何東西,即使它應該返回一個 int。

  3. 您的方法容易受到 SQL 注入的影響。 而不是將命令作為字符串傳遞,您應該傳遞一個准備好的 DbCommand,並將所有參數綁定到它。

至於問題本身,您需要將某種映射器注入到 map 和 SQL output 到這些具體對象中。 如果你想自動化它,最好在啟動時使用反射生成所需的映射器,然后重復使用它們。 這基本上就是大多數 ORM 的工作方式。 您是否有不想使用 EntityFramework 或其他 ORM 的原因? 他們基本上做你想要的開箱即用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM