Выполнить необработанный SQL-запрос в ASP.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();
        }

Проблема в том, что иногда я получаю результат запроса в течение секунды, иногда он просто продолжает загружаться в течение длительного времени и выдает ошибку, что "Вызов" Чтение ", когда устройство чтения данных закрыто, не является допустимой операцией"

Это почему? Что-то не так с моим кодом или я использую удаленный доступ к другому серверу? Решит ли переход на локальный сервер проблему?

1 ответ

API Entity Framework Code First включает методы, позволяющие передавать команды SQL непосредственно в базу данных. У вас есть следующие варианты:

• Используйте метод DbSet.SqlQuery для запросов, которые возвращают типы сущностей. Возвращаемые объекты должны иметь тип, ожидаемый объектом DbSet, и они автоматически отслеживаются контекстом базы данных, если вы не отключите отслеживание. (См. Следующий раздел о методе AsNoTracking.)

• Используйте метод Database.SqlQuery для запросов, которые возвращают типы, которые не являются сущностями. Возвращенные данные не отслеживаются контекстом базы данных, даже если вы используете этот метод для извлечения типов сущностей.

• Используйте Database.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());
}


Вызов запроса на обновление:

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


Для получения дополнительной информации ознакомьтесь со сценариями Advanced Entity Framework 6 для веб-приложения MVC 5 (12 из 12). Надеюсь это поможет...

Другие вопросы по тегам