【发布时间】:2015-04-25 10:36:56
【问题描述】:
我刚刚花了一些时间来寻找如何从方法中返回 IQueryable...我仍然想知道这是否是正确的方法。
这是我的存储库类:
public class CarRepository : ICarRepository
{
// Fake entities
private IList<Car> _entities = new List<Car>()
{
new Car() { Brand = "Lamborghini", Name = "Huracán"},
new Car() { Brand = "BMW", Name = "X6" }
};
// Allows deferred execution/further refinement
public IQueryable<Car> FindByQueryable(Expression<Func<Car, bool>> predicate)
{
var query = _entities.Where(predicate.Compile()).AsQueryable();
return query;
}
// Returning an IList or IEnumerable
public IList<Car> FindBy(Expression<Func<Car, bool>> predicate)
{
return _entities.Where(predicate.Compile()).ToList();
}
}
起初我认为这样的东西应该可以工作,但它没有编译:
public IQueryable<Car> FindByQueryable(Expression<Func<Car, bool>> predicate)
{
var query = _entities.Where(predicate);
return query;
}
我对 predicate.Compile() 和 .AsQueryable 是否正确?
感谢您的帮助! 巴斯蒂安
【问题讨论】:
-
我宁愿返回
IEnumerable<Car>而不是IQueryable。 -
@AlexSikilinda IQueryable
是数据库的better choice。但是我一般不赞成这一点,我认为返回 IQueryables 的存储库价值较低(也可以直接使用 EF/LtSql 等 linq 提供程序,并且您的抽象将在您不期望的宫殿中泄漏[例如,在以 EF 为例,是否清楚跟踪哪些数据?)。 -
这样就好了。将责任留给将与存储库交互的 Dal 层。然后在 dal 层中调用 ToList,当您完成整个查询构造时。
标签: c# linq expression iqueryable