2011-07-05 47 views
2

以下作品的代碼的任何數據,但我知道這不可能是最有效的。是否有另一種方法來詢問是否有任何行而不是使用Any()?最有效的方法來檢查,看看是否有一個SQL行

我想有NoResults股利默認是隱藏的,只有轉身的時候沒有行存在的,同樣具有中繼器在默認情況下顯示出來,只有當沒有結果列隱藏起來。

using (AgileEntities context = new AgileEntities()) 
     { 
      int StoryID = Convert.ToInt32(Request["StoryID"]); 
      var tasks = from t in context.Tasks 
         where t.StoryId == StoryID 
         orderby t.Number 
         select t; 
      rptTasks.DataSource = tasks; 
      rptTasks.DataBind(); 

      if (tasks.Any()) 
      { 
       rptTasks.Visible = true; 
       NoResults.Visible = false; 
      } 
      else 
      { 
       rptTasks.Visible = false; 
       NoResults.Visible = true; 
      } 


     } 
+0

添加到我的回答如下 - 你也可以只檢查COUNT()直接 - 但是當心就做到這一點該列表可以確保您不會執行兩次查詢。 –

回答

1
var tasks = from t in context.Tasks 
          where t.StoryId == StoryID 
          orderby t.Number 
          select t; 

    var tasksList = tasks.ToList(); 

    rptTasks.DataSource = tasksList; 
    rptTasks.DataBind(); 

    if (tasksList.Count > 0) 
      { 
       rptTasks.Visible = true; 
       NoResults.Visible = false; 
      } 
      else 
      { 
       rptTasks.Visible = false; 
       NoResults.Visible = true; 
      } 

的ToList()調用將執行查詢並創建任務對象的列表

+0

我會在這裏重寫任何東西。如果沒有數據,則中繼器不會顯示,因此不需要切換可見性。在中繼器的DataBound事件中,我會計算其項目以查看是否爲空,並且會在那裏切換無結果div。當然,.Net有一個ListView控件,可以很好地處理這個問題。 我會移動其他類中的查詢(實際上在其他dll中)。現在我們看到LINQ,而不是後面代碼中的SQL語句。喬恩哈丁,請不要在代碼中將此視爲違法行爲。 –

+0

中繼器具有頁眉和頁腳的模板,因此,如果沒有結果都列出來,我想隱藏那些爲好。根本沒有進攻。我曾經工作過的代碼,我剛接觸.net,希望變得更好! if語句隱藏/顯示這兩個項目看起來像很多代碼,結果很少。有沒有更有效的方法來做到這一點? –

+0

它取決於你需要創建的html。我很高興與ListView控件,它也可以作爲中繼器使用,它具有的局面模板時,數據源爲空或列表爲空。我也使用中繼器,但如果我需要這樣的事情,我會用ListView控件去。我的意見是更對我的回答之前的評論的反應,可惜刪除,這是說一些關於if語句,它需要被重新分解。 –

0

你可以改變這一點:

rptTasks.Visible = tasks.Any(); 
NoResults.Visible = !rptTasks.Visible; 
+0

這個想法不是發送到服務器的查詢。第一個在rptTasks.DataBind()發送,第二個在if(tasks.Any())。這不是關於重新考慮if語句。 –

0

DataBind()電話已經引起將要執行的查詢,因此調用最重要的是Any()不應該再花一分錢。

+0

我相信是執行兩次查詢。 –

2

小心 - 調用.Any()可能會重新執行您的查詢 我會這樣做一點'安全'以確保單次執行。

 

//force execution once 
var taskList = tasks.ToList(); 
rptTasks.Visible = taskList.Count>0; 
NoResults.Visible = taskList.Count==0; 

And 
rptTasks.DataSource = tasksList; 
rptTasks.DataBind(); 
 

與任何(問題)和COUNT()是他們導致代碼執行一遍又一遍 - 測試用例

 

static void Main(string[] args) 
{ 
      //Populate the test class 
      List list = new List(1000); 
      for (int i=0; i o.CreateDate.AddSeconds(5) > DateTime.Now); 
      while (newList.Any()) 
      { 
       //Note - are actual count keeps decreasing.. showing our 'execute' is running every time we call count. 
       Console.WriteLine(newList.Any()); 
       System.Threading.Thread.Sleep(500); 
      } 
} 

 

您可以代替任何()以計數()以上顯示。基本上代碼保持當你調用評估查詢任何() - 我不知道這是否適用於LINQ to SQL的,雖然如果有什麼不同的緩存機制。

相關問題