2012-05-07 52 views
2

我有這個類使用LINQ到SQL,我如何實現相同的使用正常的SQL在ASP.NET MVC 3沒有使用EF?如何在沒有EF的ASP.NET MVC中使用普通的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方法返回一個DataRows列表。不是您的自定義域實體。 實體框架爲您提供域實體列表。所以在自定義SQL的情況下,您需要將Data Row自己映射到自定義對象的實例。

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

這會給你其中有2個屬性,NameCampusName匿名類型的列表。假設名稱和校園名稱是查詢結果中存在的2列。

EDIT2:根據註釋,在視圖中列出這些數據,創建一個名爲索引視圖控制器內的下視圖(在這裏我們寫這個動作方法)的文件夾Folder.We需要使它成爲一個強類型視圖。可是等等!我們會傳遞什麼類型的視圖?

我們的結果是匿名類型。所以我們將在這種情況下創建一個ViewModel,而不是匿名的,我們將返回一個ViewModel的列表。現在

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

,我們將更新我們這樣的指數動作的代碼。

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窗體等中執行相同的操作。查看使用ADO.NET進行查詢或Dapper

相關問題