如何测试lambda表达式的查询结果是否为空?

时间:2011-03-13 08:03:25

标签: c# .net linq

var query = from emp in dbEmp.Employees
            join dept in dbEmp.Departments on emp.DeptID equals dept.DeptID
            where dept.DepartmentName.Contains(this.TextBox1.Text)
            select new
            {
                EmpID = emp.EmpID,
                EmpName = emp.EmpName,
                Age = emp.Age,
                Address = emp.Address,
                DeptName = dept.DepartmentName
            };

if (query == null)
    Label1.Text = "no results match your search";

GridView1.DataSource = query;
GridView1.DataBind();

一切都以正确的方式工作,但是当查询结果返回null时,标签不显示消息。标签可以无条件显示(query == null)。那么如何测试var查询结果是否返回任何内容?感谢

5 个答案:

答案 0 :(得分:9)

如果我能教给人们关于LINQ的一件事就是:

查询表达式的值是查询而不是查询的结果

当你说

var q = from c in customers where c.City == "London" select c.Name;

q不包含伦敦的一系列客户名称。 q包含一个查询,表示操作查询客户数据库,如下所示...... 。查询未运行;你所做的就是创建查询。当您枚举查询时,就是查询获取结果时。

答案 1 :(得分:8)

if (!query.Any())
{
 // no results
}

答案 2 :(得分:3)

您正在寻找的条件是

if (query.Count() == 0)

由于实际的query变量将始终包含有效(非空)查询对象本身,而不是查询结果。

答案 3 :(得分:2)

查询永远不会为空。查询的结果可以是空集。您可以检查查询是否包含至少一个项目,或者可以强制它完全执行。

if (!query.Any()) {
    // no results
}

GridView1.DataSource = query;
GridView1.DataBind();

var results = query.ToList();
if (!results.Any()) {
    // no results
}

// Here you should use results instead of query because
// there is no need to re-evaluate the query again.

GridView1.DataSource = results;
GridView1.DataBind();

在这种情况下,后一种解决方案很可能更好。

答案 4 :(得分:1)

您希望避免两次评估查询,因此首先应保存其结果。然后检查它是否空白以及数据绑定或显示错误:

var results = query.ToList();
if (!results.Any())
    Label1.Text = "no results match your search";

GridView1.DataSource = results;
GridView1.DataBind();