为什么使用AsQueryable()而不是List()?
为什么使用AsQueryable()而不是List()?
在大多数情况下,使用AsQueryable是没有意义的,除非你被迫将IQueryable传递给一个方法,而你只有一个IEnumerable,这是一种hack。
AsQueryable是一个扩展方法,用于IEnumerable
1. 如果IEnumerable
2. 否则,创建一个'fake' IEnumerable
AsQueryable并不是无用的,正如你所说的“被迫传递IQueryable”的用例是有效的,它允许你使用IQueryable所提供的功能,而这比IEnumerable更多。我不认为这是一个hack,它有其用途,例如在这里可以看到:wcf.codeplex.com/…。但我猜你想说的是它不能用于深入影响Enumerable数据的生成方式(例如优化查询),它只能在已有的基础上工作。
为什么要使用AsQueryable()而不是List()?
在使用LINQ查询时,可以使用AsQueryable()或List()方法来获取数据集。AsQueryable()方法创建一个查询,包含从数据库获取列表所需的指令。而List()方法返回一个实际的列表,其中包含内存中的所有项。
AsQueryable()方法的优势在于,可以随时对查询进行修改,例如添加新的Where子句,这些子句可以发送到数据库级别进行过滤。这样可以利用数据库提供的快速过滤功能。相反,如果使用List()方法,过滤是在应用程序中进行的,需要先获取所有信息,然后再进行过滤。
因此,使用AsQueryable()方法可以在最后一刻之前等待决定如何处理数据。
此外,除了“快速过滤”之外,还需要考虑通过网络发送所有信息的开销。
另外,如果返回的是一个IQueryable对象,需要找到一种好的方法来确保:1)上下文在查询执行时保持打开状态;2)上下文被正确地释放。而返回一个列表的好处是,可以在方法内部控制上下文的生命周期。哪种方法更适合取决于实际需求。
此外,还可以通过将谓词作为参数传递给存储库方法,以更方便地应用过滤条件。例如,可以定义一个方法public GetMyEntities
,然后在查询中附加谓词,如return context.MyEntities.Where(pred).ToList();
。在调用时,可以在方法调用中应用谓词,而不是之后应用谓词:repo.GetMyEntities(x => x.ThatProperty == false)
。这样做可能会导致非Linq2Sql兼容的方法抛出异常,但每种方法都有其权衡。
如果使用GetMyEntities
而不是GetMyEntities
会发生什么呢?