2016-02-28 52 views
3

在LINQ是有之間的差異:即第一查詢使用包括C#LINQ包括前 - 後其中

EFDbContext _db = new EFDbContext(); 



    1)_db.UserQuizes 
     .Where(uq => uq.UserId == currentUserId && uq.QuizId == quizId) 
     .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question)).First() 

2)_db.UserQuizes 
     .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question))       
     .Where(uq => uq.UserId == currentUserId && uq.QuizId == quizId).First() 

    3)_db.UserQuizes 
      .Include(qz => qz.Quiz.VerbalQuizes.Select(q => q.Question)) 
      First(uq => uq.UserId == currentUserId && uq.QuizId == quizId) 

通知後在那裏和第二前哪裏,但結果是相同的。另外如何看到實際的SQL查詢?在這個特殊情況下,perfomance是我的主要目標,我可以改進查詢嗎?我需要更改兩個屬性:UserQuizes屬性和UserQuizes-> VerbalQuizes-> Question屬性。

它會更好分裂這兩個查詢或使用像,因爲它是指令

+0

此實體框架? –

+0

是的,抱歉讓人困惑 – user3857731

+1

使用SqlProfiler查看發送到SQLServer的查詢(有點cumersome工具,但它做你需要的),或者使用Glimpse和EF插件來顯示給定頁面生成的SQL。 – csharpfolk

回答

3

訂購,就像你經常所示不會使EF或LINQ to SQL中的差異。查詢構建器將您的整個LINQ語句轉換爲抽象邏輯表示形式,然後另一個傳遞將邏輯結構轉換爲SQL語句。所以WHERE謂詞都將在同一個地方結束。 First()中的謂詞剛剛被推送到WHERE子句。 Include報表也會累積並預測到JOIN,以包含生成包含實體所需的額外列。

所以簡短的答案是EF將通常產生最合乎邏輯的SQL語句,無論您構建LINQ語句的順序如何。如果您需要進一步調整它,您應該查看一個存儲過程,您可以在其中手工製作SQL。