正在返回Enumerable.Empty<;T>;().AsQueryable()是个坏主意

本文关键字:AsQueryable 返回 Enumerable Empty lt gt | 更新日期: 2023-09-27 17:58:13

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

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

这个想法是,如果没有currentlyHeldId可以查询,就没有理由再查询数据库。如果currentlyHeld没有值,LINQ to SQL仍然会查询数据库。这种方法有什么问题吗?我意识到,一般来说,还有一些其他问题与返回IQueryable有关,但撇开这些争论不谈,像这样试图绕过db调用有什么错吗?

正在返回Enumerable.Empty<;T>;().AsQueryable()是个坏主意

我认为你应该重新思考你的函数实际要做什么。如果你返回一个IQueryable<T>,那么这意味着调用者将存储结果查询,并在他们实际执行查询时收到最新的结果。记住:在这种情况下,数据库实际上不会被查询,直到对查询调用.ToList().ToArray()foreach等。

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

一般来说,我会尽量避免返回空的可查询项,因为这可能会误导调用者他们实际得到的内容。

对我来说似乎很好。如果从消费端来看功能完全相同,那应该是非常好的。