Asp.net-Core

具有自定義模型的實體框架核心原始 SQLQuery

  • September 22, 2021

使用 Entity Framework 6,我能夠使用執行原始 SQL 查詢並使用未在 DBContext 中定義的自定義模型來儲存查詢的輸出。一個簡單的例子如下:

List<MyModel> data = context.Database.SqlQuery<MyModel>("SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;").ToList();

我執行了一個 SQL 命令,我期望得到一個自定義模型列表。

我嘗試使用 Entity Framework Core 做類似的事情,我發現的最接近的範例將迫使我從 DBContext 定義一個屬性。這將不允許我使用自定義模型來填充 SQL Server 將返回的數據。

var books = context.Books.FromSql("SELECT * FROM Books").ToList();

此查詢通知 Entity Framework Core 該查詢將返回書籍列表。有沒有辦法在 Entity Framework Core 中實現這樣的東西?

問題是關於 .NET Core 2 的。現在我有一個解決方案,我將在此處編寫它,以便其他人可以在他/她需要時使用它。

首先我們在 dbContext 類中添加以下方法

public List<T> ExecSQL<T>(string query)
{
   using (var command = Database.GetDbConnection().CreateCommand())
   {
       command.CommandText = query;
       command.CommandType = CommandType.Text;
       Database.OpenConnection();

       List<T> list = new List<T>();
       using (var result = command.ExecuteReader())
       {
           T obj = default(T);
           while (result.Read())
           {
               obj = Activator.CreateInstance<T>();
               foreach (PropertyInfo prop in obj.GetType().GetProperties())
               {
                   if (!object.Equals(result[prop.Name], DBNull.Value))
                   {
                       prop.SetValue(obj, result[prop.Name], null);
                   }
               }
               list.Add(obj);
           }
       }
       Database.CloseConnection();
       return list;
   }
}

現在我們可以有以下程式碼。

List<Customer> Customers = _context.ExecSQL<Customer>("SELECT ......");

引用自:https://stackoverflow.com/questions/48278258