2012-05-07 2 views
2

私はlinqをSQLに使用してこのクラスを持っていますが、ASP.NET MVC 3を使用せずに通常のSQLを使用して同じように実装するにはどうすればいいですか?EFのないASP.NET MVCでnormal sqlを使用するには?

public ActionResult Index() 
{ 
    var List = (from c in db.OFFICE 
       join s in db.CAMPUS_UNIVERSITY on c.IdCampus equals s.IdCampus 
       join u in db.UNIVERSITY on s.IdUniversity equals u.IdUniversity 
       select u).ToList(); 

    return View(List); 
} 

答えて

6

これは単なるサンプルです(&が動作しています)。コントローラクラス内に​​メソッドを保持しています。​​メソッドをいくつかのサービスレイヤに移動して、多くのUI /コントローラで使用できるようにすることをお勧めします。

public ActionResult Index() 
    { 
     var items= GetUniversities(); 
     return View(items); 
    } 

    private List<DataRow> GetUniversities() 
    { 
     List<DataRow> list=null; 
     string srtQry = "SELECT U.* FROM Office O INNER JOIN 
         CampusUniversity CU ON O.IdCampus equals CU.IdCampus 
         INNER JOIN UNIVERSITY U ON U.IdUniversity=CU.IdUniversity"; 
     string connString = "Database=yourDB;Server=yourServer;UID=user;PWD=password;"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      string strQry = ""; 
      using(SqlCommand objCommand = new SqlCommand(srtQry, conn)) 
      { 
       objCommand.CommandType = CommandType.Text; 
       DataTable dt = new DataTable(); 
       SqlDataAdapter adp = new SqlDataAdapter(objCommand); 
       conn.Open(); 
       adp.Fill(dt); 
       if (dt != null) 
       { 
        list = dt.AsEnumerable().ToList(); 
       } 
      } 
     } 
     return list; 
    } 

GetCustomersメソッドは、DataRowのリストを返します。カスタムドメインエンティティではありません。 エンティティフレームワークは、ドメインエンティティのリストを提供しています。したがって、カスタムSQLの場合、データ行を独自のカスタムオブジェクトのインスタンスにマップする必要があります。 LINQで

、あなたはこの

public ActionResult Index() 
{ 
    var items= GetCustomers();  

    var newItems = (from p in items 
         select new 
         { 
          Name= p.Field<String>("Name"), 
          CampusName= p.Field<String>("CampusName") 
         }).ToList(); 

    return View(newItems); 
} 

のようなカスタムオブジェクトへのDataRowのリストを変換することができますこれは、あなた2つのプロパティ、NameCampusNameを持っている匿名型のリストが表示されます。名前とCampusNameがクエリ結果に2列あると仮定します。

EDIT2は:コメントを1として、ビューの下にフォルダ(私たちは、このアクションメソッドを書いたところ)をFolder.Weが強く型付けされたようにする必要があり、あなたのコントローラ内のインデックスと呼ばれるビューを作成し、ビューにこれらのデータを一覧表示しますビュー。ちょっと待って!ビューにどのようなタイプを渡しますか?

私たちの結果は、匿名のタイプです。そこで、この場合はViewModelを作成し、annonymousの代わりにViewModelのListを返します。

public class UniversityViewModel 
{ 
    public string UniversityName { set;get;} 
    public string CampusName { set;get;} 
} 

ここで、このようなIndexアクションでコードを更新します。

var newItems = (from p in items 
       select new UserViewModel 
       { 
        UniversityName = p.Field<String>("Name"), 
        CampusName = p.Field<String>("CampusName") 
       }).ToList(); 

ここでは、ここではタイプを変更しました。したがって、出力はもう公式ではありません。しかし、既知のタイプ。

私たちはこのようなコードを書いてみましょう。

@model IEnumerable<SO_MVC.Models.UserViewModel> 
@foreach (var item in Model) 
{ 
    <p>@item .UniversityName @item.CampusName</p> 
} 

このビューは、ViewModelのコレクションに強く入力されます。いつものように私たちはそれを繰り返して表示しています。これは正常に動作するはずです。それはテストされています。

+0

友人@Shyjuさん、ありがとう、私はどのようにこれらのデータを表示するには、私はモデルのクラスを作成する必要がありますか?どのようにクエリにパラメータを追加できますか? –

+0

@JoseLuis:ビュー内の項目を表示するための回答を更新しました。私はあなたがコメントにそれを尋ねるのではなく、関連する詳細で新しい質問を投稿することをお勧めします。がんばろう。お役に立てれば。 – Shyju

0
SELECT 
    u.* 
FROM 
    OFFICE c 
    INNER JOIN CAMPUS_UNIVERSITY s ON c.IdCampus = s.IdCampus 
    INNER JOIN UNIVERSITY u ON s.IdUniversity = u.IdUniversity 
2

これは、必ずしもMVC固有ではありません。 WebformsやWindows Formsなどでも同じことができます。ADO.NET、またはDapperをご覧ください。

関連する問題