2011-07-05 48 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的,虽然如果有什么不同的缓存机制。

相关问题