2011-07-05 16 views
2

作品次のコード内のすべてのデータがあるかどうかを確認するために、私はそれが最も効率的ではないことを知って。 Any()を使用するのではなく、行があるかどうかを調べるもう1つの方法はありますか?最も効率的な方法は、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

オブジェクトタスクのリストを作成します - また、あなただけの直接)(カウントを確認することができます - しかし、再びこれを行うには用心クエリを2回実行しないことを確認するためのリスト。 –

答えて

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)でクエリを移動します。コード内のSQL文の代わりに、LINQが表示されます。ジョンハーディング、あなたのコードでこれを犯罪とみなさないでください。 –

+0

リピーターにはヘッダーとフッターのテンプレートがあります。結果が表示されない場合は、それらも非表示にしたいと思います。犯行は全くありません。私が働いていたコード、私は.netには新しく、より良くなりたい! 2つの項目を隠す/表示するif文は、ほとんど結果が得られないようなコードのようです。それを行うより効率的な方法はありますか? –

+0

これは、作成する必要のあるHTMLに依存します。私はListViewコントロールに非常に満足しています。リピーターとしても使用でき、データソースがnullまたはリストが空の場合の状況のた​​めのテンプレートを持っています。リピータも使用していますが、このようなものが必要な場合は、ListViewコントロールを使用します。私のコメントは、残念なことに削除された、私の答えに対する以前のコメントに対する反応でした。これは、ifステートメントについて何かを言っていたので、再集計する必要があります。 –

0

あなたはでこれを変更することができます。

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

このアイデアは、サーバーへのクエリに送信することではありません。最初のものはrptTasks.DataBind()で送信され、もう1つはif(tasks.Any())で送信されます。したがって、if文を再作成することではありません。 –

0

あなたDataBind()コールはまだ、さらにあなたに何も費用はならないことの上にAny()を呼び出して、クエリが実行される原因となっています。

+0

私は、クエリが2回実行されると思います。 –

2

注意 - .Any()を呼び出すとクエリが再実行される可能性があります。 これを実行すると、1回の実行で確実に「安全」になります。

 

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); 
      } 
} 

 

あなたはどれ()カウント(と)に上記を置き換えることができ、テストケース -

 

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

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

どれ(との問題)とカウントは()、彼らはあなたのコードが何度も実行させていますショー。基本的にコードでは、Any()を呼び出すときにクエリを評価し続けます。異なるキャッシュメカニズムがある場合でも、LinqにSqlが適用されるかどうかはわかりません。

関連する問題