我有这个类使用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);
}
Run Code Online (Sandbox Code Playgroud)
这只是一个示例.(经过测试和工作).这就是我将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;
}
Run Code Online (Sandbox Code Playgroud)
请记住,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);
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个匿名类型列表,其中包含2个属性,Name以及CampusName.假设Name和CampusName是查询结果中的2列.
EDIT2:根据评论,要在视图中列出这些数据,在视图文件夹下创建一个名为Index的视图(在我们编写此操作方法的位置)文件夹.我们需要使它成为强类型视图.可是等等!我们将传递给视图的是什么类型?
我们的结果是匿名类型.所以我们将在这种情况下创建一个ViewModel而不是匿名,我们将返回ViewModel的List.
public class UniversityViewModel
{
public string UniversityName { set;get;}
public string CampusName { set;get;}
}
Run Code Online (Sandbox Code Playgroud)
现在我们将像这样更新Index操作中的代码.
var newItems = (from p in items
select new UserViewModel
{
UniversityName = p.Field<String>("Name"),
CampusName = p.Field<String>("CampusName")
}).ToList();
Run Code Online (Sandbox Code Playgroud)
唯一的变化是我们现在提到了一种类型.所以输出不再是匿名类型.但已知的类型.
让我们回到我们的View并编写这样的代码.
@model IEnumerable<SO_MVC.Models.UserViewModel>
@foreach (var item in Model)
{
<p>@item .UniversityName @item.CampusName</p>
}
Run Code Online (Sandbox Code Playgroud)
此视图是对ViewModel集合的强类型.像往常一样,我们正在循环并显示.这应该工作正常.它是经过测试的.