检查SQL行中是否有任何数据的最有效方法

时间:2011-07-05 21:08:47

标签: asp.net sql linq

下面的代码有效,但我知道它不是最有效的。有没有其他方法可以询问是否有任何行而不是使用Any()?

我希望默认情况下隐藏NoResults Div,并且只在没有行存在时打开,同样默认情况下会显示转发器,并且只有在没有列出结果时才隐藏。

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


        }

4 个答案:

答案 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();

Any()和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);
            }
}


你可以用上面的Count()替换Any()来显示。基本上,当你调用Any()时,代码会继续评估查询 - 我不确定这是否适用于Linq to Sql,尽管有任何不同的缓存机制。

答案 1 :(得分: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()调用将执行查询并创建任务对象列表

答案 2 :(得分:0)

您可以使用以下方式进行更改:

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

答案 3 :(得分:0)

您的DataBind()来电已经导致查询被执行,因此在此基础上调用Any()不应该花费任何其他费用。