如何使用普通的SQL在ASP.NET MVC没有EF?(How to use normal sql

2019-07-29 07:08发布

我已经使用这个类的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);
}

Answer 1:

这仅仅是一个示例。(测试&工作)。那是我易保持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个属性,匿名类型的列表NameCampusName 。 假设名称和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>
}

这种观点是强类型的,以我们的视图模型的集合。 像往常一样,我们循环通说和显示。 这应该很好地工作。 据测试。



Answer 2:

这不一定是MVC具体。 你可以做同样的事情在Web表单或Windows窗体,等等看看使用ADO.NET为您查询或小巧玲珑 。



Answer 3:

SELECT
    u.*
FROM
    OFFICE c
    INNER JOIN CAMPUS_UNIVERSITY s ON c.IdCampus = s.IdCampus
    INNER JOIN UNIVERSITY u ON s.IdUniversity = u.IdUniversity


文章来源: How to use normal sql in ASP.NET MVC without EF?