我有使用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); }
这只是一个示例。(经过测试和工作)。这就是将GetUniversities方法保留在控制器类中。我建议您将GetUniversities方法移至某个服务层,以便许多UI /控制器可以使用该方法。
GetUniversities
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情况下,您需要自己将数据行映射到自定义对象的实例。
使用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个属性匿名类型的列表,Name和CampusName。假设Name和CampusName是查询结果中出现的2列。
Name
CampusName
EDIT2:按照注释,要在视图中列出这些数据,请在“视图” 文件夹下的控制器(我们在其中编写了此操作方法的文件夹)文件夹中创建一个名为“索引”的视图。我们需要使其成为强类型视图。可是等等!我们要传递给视图什么类型?
我们的结果是匿名类型。因此,在这种情况下,我们将创建一个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();
唯一的变化是我们现在在这里提到一种类型。因此输出不再是匿名类型。但已知类型。
让我们回到我们的View并编写这样的代码。
@model IEnumerable<SO_MVC.Models.UserViewModel> @foreach (var item in Model) { <p>@item .UniversityName @item.CampusName</p> }
此视图强烈键入我们ViewModel的集合。像往常一样,我们正在遍历并显示。这应该工作正常。经过测试。