如何检查IQueryable结果集是否为空?最佳方法是什么?

47

我只想知道如何最好地检查一个 IQueryable 的结果是否没有值。

例如,如果我们有一个方法:

public static IQueryable<Table> DisplayAll()
{
    var db = new DataContext();
    var list= from data in db.Table select data;
    return list;
}

然后我们会做类似这样的事情

var list = DisplayAll();
if(list != null)
{
     //do something --- in here even if the result set has no values it will
     // go to this line. It just say `enumeration yielded no results`
}

有没有可能检查结果集是否具有内容?

谢谢

3个回答

92

list 在使用 LINQ 时永远不会为 null;如果需要的话,它只会表示一个“空集合”。测试方法是使用 Any 扩展方法:

if (list.Any()) {
    // list has at least one item
}

3
为什么?我敢打赌,在这个特定的例子中,Any()会导致执行一个SELECT COUNT(*) ...和一个整数比较。即使它采取了傻瓜式的枚举结果集的方法,ToList怎么可能更快呢? - Jon
1
@HenkHolterman 因此需要质疑您是否应该检查列表是否包含任何内容,或者仅尝试迭代结果(绑定)并在没有结果时不显示任何内容。 OP没有指定他们想要检查的原因。 - Jim Wooley
如果您想获取Count(),该怎么办?比如说,如果您想确保查询只有一个结果呢?我想我的担忧在于使用Count(),即枚举查询结果。 - IAbstract
如果您期望恰好(或最多)一个结果,则可以使用“Single”或“SingleOrDefault”,它们将在枚举第二个元素时立即引发异常。 - Jon
@Jon:我不想随意放弃,那会很昂贵。但我会发一个相关问题。 - IAbstract
显示剩余2条评论

4
如果IQueryable没有返回结果,就会抛出异常。我使用以下代码:
using System.Data.Entity; //for Async support in EF
var tQ = await _tableRepository.DisplayAll();
try { return await tQ.ToListAsync(); }
catch { return null; }

捕获异常并返回null;或者如果您更喜欢的话,返回一个空列表。

catch { return new List<Table>(); }

-1

这是对我有效的方法:

    public IQueryable SomeFunc()
    {
        IQueryable result = Repo.SomeLinqQuery();
        if (result.GetEnumerator().MoveNext() == false)
        {
            throw new Exception("Results empty");
        }
        return result;
    }

3
为什么你真的需要做这件事? - huMpty duMpty
1
这部分很好:result.GetEnumerator().MoveNext() == false。 - cfnerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接