开发者

Most efficient way to check to see if there is any data in a SQL row

The code below works, but I know it can't be the most efficient. Is there another way to ask if there are any rows rather than using Any()?

I'd like to have the NoResults Div hidden by default and only turned on when no rows are present, likewise have the repeater show up by default and only hidden when no results are listed.

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;
    开发者_如何学C        rptTasks.DataSource = tasks;
            rptTasks.DataBind();

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


        }


Caution - calling .Any() may re-execute your query I would do this a bit 'safer' to ensure single execution.


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

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

The problem with Any() and Count() is they cause your code to execute over and over - a test case


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


You can replace Any() with Count() above to show. Basically the code keeps evaluating the query when you call Any() - I'm not sure if this applies to Linq to Sql though if there is any different caching mechanism.


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

The ToList() call will execute the query and create a list of tasks objects


Your DataBind() call has already caused the query to be executed, so calling Any() on top of that shouldn't cost you anything further.


You can change this with :

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜