我知道这可能是我的观点,但我正在寻找最佳实践。
据我所知,IQueryable<T>实现了IEnumerable<T>,所以在我的DAL中,我目前有如下方法签名:
IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);我应该在这里使用IQueryable<T>吗?
这两种方法的优缺点是什么?
请注意,我计划使用Repository模式,因此我将拥有一个如下所示的类:
public class ProductRepository {
DBDataContext db = new DBDataContext(<!-- connection string -->);
public IEnumerable<Product> GetProductsNew(int daysOld) {
return db.GetProducts()
.Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
}
}我应该把我的IEnumerable<T>改成IQueryable<T>吗?其中之一有什么优点/缺点?
发布于 2010-06-15 01:14:46
这取决于你想要什么样的行为。
< requested
虽然后者为调用者提供了很大的灵活性(假设您的存储库完全支持它),但它是最难测试的,而且可以说是最不确定的。
发布于 2010-06-17 11:19:35
还有一件事需要考虑:你的分页/排序支持在哪里?如果您在存储库中提供分页支持,那么返回IEnumerable<T>就可以了。如果您在存储库外部进行分页(如在控制器或服务层中),那么您确实希望使用IQueryable<T>,因为您不希望在分页之前将整个数据集加载到内存中。
发布于 2010-06-15 01:14:00
HUUUUGGGE差异。我经常看到这一点。
您可以在IQueryable访问数据库之前构建它。IQueryable只会在调用eager函数(例如,.ToList())或者您实际尝试提取值时才会访问数据库。IQueryable =懒惰。
IEnumerable将立即对DB执行您的lambda。IEnumerable =渴望。
至于在Repository模式中使用哪种模式,我相信它是迫切需要的。我通常会看到ILists被通过,但其他人需要为你解决这个问题。编辑-您通常会看到IEnumerable而不是IQueryable,因为您不希望图层超过资料档案库A)确定何时发生数据库命中或B)将任何逻辑添加到资料档案库外部的连接中
有一个非常好的LINQ视频,我很喜欢--它不仅仅是IEnumerable v IQueryable,它确实有一些奇妙的洞察力。
http://channel9.msdn.com/posts/matthijs/LINQ-Tips-Tricks-and-Optimizations-by-Scott-Allen/
https://stackoverflow.com/questions/3039262
复制相似问题