3

我有这个类使用 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);
}
4

3 回答 3

6

这只是一个示例。(经过测试和工作)。也就是说,您将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 案例中,您需要自己将 Data Row 映射到自定义对象的实例。

使用 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 列。

EDIT2:根据评论,要在视图中列出这些数据,请在 Views 文件夹下的控制器(我们在其中编写此操作方法)文件夹中创建一个名为 Index 的视图。我们需要使其成为强类型视图。可是等等!我们要将什么类型传递给视图?

我们的结果是匿名类型。因此,在这种情况下,我们将创建一个 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();

唯一的变化是我们现在在这里提到了一个类型。所以输出不再是匿名类型。但已知类型。

让我们回到我们的视图并编写这样的代码。

@model IEnumerable<SO_MVC.Models.UserViewModel>
@foreach (var item in Model)
{
   <p>@item .UniversityName @item.CampusName</p>
}

这个视图被强类型化到我们的 ViewModel 的集合中。像往常一样,我们正在循环播放并显示。这应该可以正常工作。它经过测试。

于 2012-05-07T18:58:21.157 回答
2

这不一定是 MVC 特定的。您可以在 Webforms 或 Windows Forms 等中做同样的事情。看看使用ADO.NET进行查询或Dapper

于 2012-05-07T18:37:39.930 回答
0
SELECT
    u.*
FROM
    OFFICE c
    INNER JOIN CAMPUS_UNIVERSITY s ON c.IdCampus = s.IdCampus
    INNER JOIN UNIVERSITY u ON s.IdUniversity = u.IdUniversity
于 2012-05-07T18:37:17.577 回答