[英]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?
幾點:
您應該創建一個具體類型來返回您的數據,而不是使用object 。 您的方法真的很難維護,並且讓潛在用戶感到困惑,因為不知道究竟返回了哪些數據。
你不在方法中的任何地方使用泛型參數 T 並且你不返回任何東西,即使它應該返回一個 int。
您的方法容易受到 SQL 注入的影響。 而不是將命令作為字符串傳遞,您應該傳遞一個准備好的 DbCommand,並將所有參數綁定到它。
至於問題本身,您需要將某種映射器注入到 map 和 SQL output 到這些具體對象中。 如果你想自動化它,最好在啟動時使用反射生成所需的映射器,然后重復使用它們。 這基本上就是大多數 ORM 的工作方式。 您是否有不想使用 EntityFramework 或其他 ORM 的原因? 他們基本上做你想要的開箱即用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.