3

私は linq to sql を使用してこのクラスを持っていますが、EF を使用せずに ASP.NET MVC 3 で通常の 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);
}
4

3 に答える 3

6

これは単なるサンプルです。(テスト済みで動作中)。つまりGetUniversities、コントローラー クラス内にメソッドを保持しています。GetUniversities多くの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 メソッドは DataRows のリストを返すことに注意してください。カスタム ドメイン エンティティではありません。Entity Framework は Domain Entities のリストを提供しています。したがって、カスタム SQL の場合、データ行をカスタム オブジェクトのインスタンスにマップする必要があります。

LINQ を使用すると、次のように DataRow のリストをカスタム オブジェクトに変換できます。

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);
}

Nameこれにより、2 つのプロパティを持つ匿名型のリストが得られますCampusName。Name と CampusName がクエリの結果に存在する 2 つの列であると仮定します。

EDIT2:コメントに従って、これらのデータをビューにリストするには、 Viewsフォルダーの下のコントローラー(このアクションメソッドを記述した場所)フォルダー内にIndexというビューを作成します。強く型付けされたビューにする必要があります。ちょっと待って!ビューに渡す型は何ですか?

結果は匿名型です。この場合、ViewModel を作成し、匿名の代わりに、ViewModel のリストを返します。

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 のコレクションに厳密に型指定されています。いつものように、それをループして表示しています。これはうまくいくはずです。テスト済みです。

于 2012-05-07T18:58:21.157 に答える
2

これは必ずしも MVC 固有のものではありません。Webforms や Windows Forms などで同じことを行うことができます。クエリまたはDapperにADO.NETを使用することを検討してください。

于 2012-05-07T18:37:39.930 に答える
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
于 2012-05-07T18:37:17.577 に答える