在ASP中执行原始SQL查询.. NET MVC,数据库优先模式



我的项目模型是数据库优先,并使用远程访问另一台服务器上的数据库。我需要使用原始SQL查询,因为我的查询非常复杂,我觉得SQL比LINQ更舒服。

我是这样做的:

        string query = "select * from Inquiry_TBL where ...";
        using (educationEntities db = new educationEntities())
        {
            var list = db.Database.SqlQuery<Inquiry_TBL>(query);
            ViewData["total"] = list.Count();
        }

问题是有时我得到查询结果在一秒钟内,有时它只是保持加载很长一段时间,并给我一个错误,'调用'读取'当数据阅读器关闭不是一个有效的操作。'

为什么?是我的代码有问题,还是因为我使用远程访问另一台服务器?切换到本地服务器能解决问题吗?

实体框架代码优先API包括使您能够将SQL命令直接传递给数据库的方法。您有以下选项:

•使用DbSet。返回实体类型查询的SqlQuery方法。返回的对象必须是DbSet对象所期望的类型,除非关闭跟踪,否则它们将由数据库上下文自动跟踪。(参见下面关于AsNoTracking方法的部分)

•使用数据库。SqlQuery方法,用于返回非实体类型的查询。返回的数据不被数据库上下文跟踪,即使使用此方法检索实体类型也是如此。

•使用数据库。ExecuteSqlCommand用于非查询命令。


调用查询返回实体:

public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    // Commenting out original code to show how to use a raw SQL query.
    //Department department = await db.Departments.FindAsync(id);
    // Create and execute raw SQL query.
    string query = "SELECT * FROM Department WHERE DepartmentID = @p0";
    Department department = await db.Departments.SqlQuery(query, id).SingleOrDefaultAsync();
    if (department == null)
    {
        return HttpNotFound();
    }
    return View(department);
}

调用返回其他类型对象的查询:

public ActionResult About()
{
    //Commenting out LINQ to show how to do the same thing in SQL.
    //IQueryable<EnrollmentDateGroup> = from student in db.Students
    //           group student by student.EnrollmentDate into dateGroup
    //           select new EnrollmentDateGroup()
    //           {
    //               EnrollmentDate = dateGroup.Key,
    //               StudentCount = dateGroup.Count()
    //           };
    // SQL version of the above LINQ code.
    string query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount "
        + "FROM Person "
        + "WHERE Discriminator = 'Student' "
        + "GROUP BY EnrollmentDate";
    IEnumerable<EnrollmentDateGroup> data = db.Database.SqlQuery<EnrollmentDateGroup>(query);
    return View(data.ToList());
}

调用Update查询:

[HttpPost]
public ActionResult UpdateCourseCredits(int? credit)
{
    if (credit != null)
    {
        ViewBag.RowsAffected = db.Database.ExecuteSqlCommand(
            "UPDATE Course SET Credits = Credits * {0}", credit);
    }
    return View();
}

有关更多信息,请查看MVC 5 Web应用程序的高级实体框架6场景(12/12)。

最新更新