下面的代码有效,但我知道它不是最有效的。有没有其他方法可以询问是否有任何行而不是使用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;
}
}
答案 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()
不应该花费任何其他费用。