Asp.net-Core
具有自定義模型的實體框架核心原始 SQLQuery
使用 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 ......");