我已经使用这个类的LINQ to SQL,我如何在ASP.NET MVC 3使用普通的SQL不使用EF实现了相同的?
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 /控制器可以使用。
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的方法返回的数据行的列表。 没有你的自定义域的实体。 实体框架是给你的域实体的名单 。 因此,在自定义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
。 假设名称和CampusName出现在您的查询的结果2列。
EDIT2:根据注释,在视图中列出这些数据 ,创建一个名为索引你的控制器内视图下查看Folder.We需要使它成为一个强类型的视图(这是我们写这个动作方法)的文件夹。 可是等等! 什么类型的是我们要传递给视图?
我们的结果是annonymous类型。 因此,我们将在这种情况下创建一个视图模型和替代annonymous,我们将返回视图模型的列表。
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();
唯一的变化是现在我们在这里提到的一个类型。 所以输出没有更多annonymous类型。 但已知类型。
让我们再回到我们的观点,写这样的代码。
@model IEnumerable<SO_MVC.Models.UserViewModel>
@foreach (var item in Model)
{
<p>@item .UniversityName @item.CampusName</p>
}
这种观点是强类型的,以我们的视图模型的集合。 像往常一样,我们循环通说和显示。 这应该很好地工作。 据测试。
这不一定是MVC具体。 你可以做同样的事情在Web表单或Windows窗体,等等看看使用ADO.NET为您查询或小巧玲珑 。
SELECT
u.*
FROM
OFFICE c
INNER JOIN CAMPUS_UNIVERSITY s ON c.IdCampus = s.IdCampus
INNER JOIN UNIVERSITY u ON s.IdUniversity = u.IdUniversity