为什么使用AsQueryable()而不是List()?

33 浏览
0 Comments

为什么使用AsQueryable()而不是List()?

我正在使用存储库模式与Entity Framework和LINQ进行数据访问的实现。大多数示例中,在返回N条记录时,我看到它们使用AsQueryable()而不是List。这样做有什么优势?

0
0 Comments

为什么使用AsQueryable()而不是List()?

在大多数情况下,使用AsQueryable是没有意义的,除非你被迫将IQueryable传递给一个方法,而你只有一个IEnumerable,这是一种hack。

AsQueryable是一个扩展方法,用于IEnumerable,它可以做两件事:

1. 如果IEnumerable实现了IQueryable,则只是进行强制转换,什么也不做。

2. 否则,创建一个'fake' IEnumerable (EnumerableQuery),它实现了每个方法,编译lambda表达式并调用Enumerable扩展方法。

AsQueryable并不是无用的,正如你所说的“被迫传递IQueryable”的用例是有效的,它允许你使用IQueryable所提供的功能,而这比IEnumerable更多。我不认为这是一个hack,它有其用途,例如在这里可以看到:wcf.codeplex.com/…。但我猜你想说的是它不能用于深入影响Enumerable数据的生成方式(例如优化查询),它只能在已有的基础上工作。

0
0 Comments

为什么使用AsQueryable()而不是List()?

在返回IQueryable的情况下,优势在于直到你开始枚举结果之前,执行操作是被延迟的,你可以将查询与其他查询组合,并且仍然可以实现服务器端执行。然而,问题在于在这个方法中你无法控制数据库上下文的生命周期 - 你需要一个打开的上下文,并且必须确保它保持打开状态直到查询被执行。然后你必须确保上下文将被释放。如果你将结果返回为List,T[]或类似的东西,你将失去延迟执行和服务器端执行组合查询的优势,但你将获得对数据库上下文生命周期的控制。

当然,最适合的解决方法取决于实际需求。这是另一个没有单一真理的问题。

0
0 Comments

为什么要使用AsQueryable()而不是List()?

在使用LINQ查询时,可以使用AsQueryable()或List()方法来获取数据集。AsQueryable()方法创建一个查询,包含从数据库获取列表所需的指令。而List()方法返回一个实际的列表,其中包含内存中的所有项。

AsQueryable()方法的优势在于,可以随时对查询进行修改,例如添加新的Where子句,这些子句可以发送到数据库级别进行过滤。这样可以利用数据库提供的快速过滤功能。相反,如果使用List()方法,过滤是在应用程序中进行的,需要先获取所有信息,然后再进行过滤。

因此,使用AsQueryable()方法可以在最后一刻之前等待决定如何处理数据。

此外,除了“快速过滤”之外,还需要考虑通过网络发送所有信息的开销。

另外,如果返回的是一个IQueryable对象,需要找到一种好的方法来确保:1)上下文在查询执行时保持打开状态;2)上下文被正确地释放。而返回一个列表的好处是,可以在方法内部控制上下文的生命周期。哪种方法更适合取决于实际需求。

此外,还可以通过将谓词作为参数传递给存储库方法,以更方便地应用过滤条件。例如,可以定义一个方法public GetMyEntities (Func pred),然后在查询中附加谓词,如return context.MyEntities.Where(pred).ToList();。在调用时,可以在方法调用中应用谓词,而不是之后应用谓词:repo.GetMyEntities(x => x.ThatProperty == false)。这样做可能会导致非Linq2Sql兼容的方法抛出异常,但每种方法都有其权衡。

如果使用GetMyEntities (Expression> pred)而不是GetMyEntities(Func pred)会发生什么呢?

0