2013-05-29 62 views
4

我的項目模型首先是數據庫,並使用遠程訪問另一臺服務器上的數據庫。 我需要使用原始SQL查詢,因爲我的查詢非常複雜,而且我在SQl而非LINQ中感覺更舒適。在ASP.NET MVC中執行原始SQL查詢,數據庫優先模式

這是我該怎麼辦:

 string query = "select * from Inquiry_TBL where ..."; 

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

的問題是,有時我得到一秒鐘內查詢結果,有時它只是保持加載很長一段時間,並給我說,「中調用‘讀取’錯誤當數據讀取器關閉時不是有效的操作。'

這是爲什麼?我的代碼有什麼問題,或者因爲我正在使用遠程訪問另一臺服務器?將切換到本地服務器解決問題?

+0

告訴我們SQL是什麼,我們可以提供Linq或Lambda以及解釋。 – BlackICE

+0

查詢每次調用時都是一樣的,還是在where子句中有所不同?我將運行SQL Profiler來查看服務器上正在運行的內容。從那裏您可以將查詢粘貼到SSMS中,並在啓用顯示執行計劃的情況下運行查詢並診斷返回的內容。如果缺少指標,執行計劃也應該顯示。 – BlackICE

+0

我切換回本地服務器,它工作正常。謝謝。現在我的問題是我的SQL查詢是這樣的:「select * from Table_A inner join Table_B ...」,這意味着我將從兩個表中得到數據的返回,然後將這些數據返回給視圖。但執行sql查詢:「db.Database.SqlQuery (查詢)」只能從表「Table_A」返回數據。如果我需要「Table_A」和「Table_B」的數據,該怎麼辦? – user2093360

回答

6

實體框架代碼第一API包括使您能夠將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(); 
} 


如需更多e信息請看Advanced Entity Framework 6 Scenarios for an MVC 5 Web Application (12 of 12)。希望這有助於...

+0

你的意思是隻有代碼第一個API提供了這個功能,或者你的過程也可以應用於數據庫優先的方法。 –

+0

不,您可以在EF的幫助下使用此工具,即使您不使用Code-First。 –

+0

@MuratYıldız此回覆應標記爲「答案」。感謝您提供非常詳細的信息,並在最後提供非常豐富的鏈接。因爲我的背景也採用了「數據庫第一方法」,所以我在工作中獲得了巨大的幫助。 – nam