ORMなしでASP.NET MVCを使用する
-
03-07-2019 - |
質問
ASP MVCアプリケーションでは、標準のSQL(Linq to SQLまたは他のORMではなく)を使用してデータベースを照会しています。
データベースの結果をビューに渡し、ビューの結果を繰り返し処理します。しかし、私はこれを行う方法がわかりません。私が見たすべての例は、文字列を渡すか、L2Sを使用します。ネストされたHashtablesのようなものを渡したいのですが、考えられる唯一のことは、SqlDataReaderオブジェクトをビューに渡すことですが、これは本当に悪い考えのように聞こえます。
データベースの結果を標準SQLクエリからビューに表示するにはどうすればよいですか? Linqまたは他のORMを使用したいのですが、要件はそうではありません(理由は聞かないでください、わかりません)。私はVBでこれをやっています。提供されているC#の例を変換するように最善を尽くします。
解決
転送するデータの単純なクラスを作成し、コントローラー内のオブジェクトのリストをデータリーダーから手動で入力して、これをビューに渡すことができます。 (C#ですが、これは簡単に変換できるはずです)
// open your connection / datareader etc.
List<Customer> customers = new List<Customer>();
while(dataReader.Read())
{
Customer c = new Customer();
c.Id = dataReader.GetInt32(0);
c.Name = dataReader.GetString(1);
// etc (you might want to use string indexers instead of ints for the get methods)
customers.Add(c);
}
// close and dispose your datareader / connection etc as usual
return View("List", customers);
他のヒント
MVCは、関心の分離に関するものです。 SqlDataReaders、DataTables、またはSystem.Data名前空間にあるクラスをビューに渡すことはお勧めできません。データベースと通信する可能性のあるモデルと、このモデルをビューに渡すコントローラーを定義する必要があります。会社のポリシーでORMを使用しないと言われている場合は、MVCパターンよりも古典的なWebFormsがシナリオに適している可能性があります。
Rashackに同意します。この記事では、詳細に説明します。リンクテキスト
簡単に言うと、DataTableとDataReaderを使用して行う方法は次のとおりです。
private DataTable GetData()
{
DataTable dt = new DataTable();
using (SqlConnection connection
= new SqlConnection("ConnectionString"))
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "SELECT * FROM Customers";
connection.Open();
using (SqlDataReader reader =
command.ExecuteReader
(CommandBehavior.CloseConnection))
{
dt.Load(reader);
}
}
return dt;
}
次に、そのDataTableを、渡すエンティティオブジェクトに読み込むことができます。
これにより、LinqやORMを使用するよりもはるかに優れたパフォーマンスが得られることがわかると思います。
DataTablesを使用してみてください-DataTableはIDataReaderからデータをロードできます...(メソッドの名前はLoadと思います)
独自のデータ転送オブジェクトクラスを作成し、ADOを使用してそれらのインスタンスを設定できます。ネットコード。これらのDTOクラスは、単純な POCO スタイルのクラスで、プロパティget / setアクセサーのみが含まれています。メソッド。 POCOオブジェクトの使用は、DataSets / DataTablesよりも軽量で(余分な状態がなく)、オブジェクト指向の観点から操作するのがより直感的であるため、ほぼ間違いなく好ましいです。