小编典典

如何在没有EF的ASP.NET MVC中使用普通SQL?

sql

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

阅读 178

收藏
2021-04-22

共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方法将返回一个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个属性匿名类型的列表,NameCampusName。假设Name和CampusName是查询结果中出现的2列。

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的集合。像往常一样,我们正在遍历并显示。这应该工作正常。经过测试。

2021-04-22