C# 返回可枚举。空<;T>;是个坏主意吗?

C# 返回可枚举。空<;T>;是个坏主意吗?,c#,.net,linq,linq-to-sql,iqueryable,C#,.net,Linq,Linq To Sql,Iqueryable,这可能最好用一些代码来解释: public IQueryable<DatabaseRecord> GetQueryableLinkedRecords() { if(this.currentlyHeldIds.Count() == 0) { return Enumerable.Empty<DatabaseRecord>().AsQueryable(); } else { return from r in

这可能最好用一些代码来解释:

public IQueryable<DatabaseRecord> GetQueryableLinkedRecords()
{
    if(this.currentlyHeldIds.Count() == 0)
    {
        return Enumerable.Empty<DatabaseRecord>().AsQueryable();
    }
    else
    {
        return from r in this.DBContext.DatabaseRecords
               where this.currentlyHeldIds.Contains(r.Id)
               select r;
    }
}
public IQueryable GetQueryableLinkedRecords()
{
if(this.currentlyHeldIds.Count()==0)
{
返回可枚举的.Empty().AsQueryable();
}
其他的
{
从this.DBContext.DatabaseRecords中的r返回
其中此.currentlyHeldIds.包含(r.Id)
选择r;
}
}

其思想是,如果没有可查询的currentlyHeldId,则没有理由再次实际查询db。如果currentlyHeldIds没有值,LINQ to SQL仍将查询数据库。这种方法有什么问题吗?一般来说,我意识到与返回IQueryable相关的还有一些其他问题,但是撇开这些争论不谈,像这样绕过db调用有什么不对吗?

对我来说似乎很好。如果功能在消费端是相同的,那么它应该是非常好的。

我认为您应该重新思考您的功能实际上要做什么。如果返回的是
IQueryable
,则意味着调用方将存储结果查询,并在实际执行查询时接收最新结果。请记住:在这种情况下,在对查询调用
.ToList()
.ToArray()
foreach
等之前,实际上不会查询数据库

但是,如果您的目标是返回查询的当前状态,那么您的方法应该只返回一个
IList
或类似的内容。然后,您可以返回一个空的
列表
,或者对以其他方式构造的查询调用
.ToList()
,并返回该列表


一般来说,我会尽量避免返回空的可查询项,因为这会误导调用者,让他们知道他们实际上得到了什么。

好的一点,我没有考虑延迟执行。
currentlyHeldIds
的内容可能在调用方法和迭代方法之间发生了变化。很好的一点是,它肯定没有考虑延迟执行方面。