IEnumerable 和 IQueryable,当我使用 var 关键字时,它使用哪一个?
我读过有关 IEnumerable 和 IQueryable 的内容,我读到 IQueryable 与 linq 配合使用效果更好,因为当您使用 where 子句时,它会创建所需的精确查询,但使用 IEnumerable 时,它会从数据库中检索所有行,然后在内存上进行筛选。
确切的问题在这里: 这是一样的吗?
更好的方法是怎样的呢?
public ActionResult Index()
{
var positions = unitOfWork.PositionRepository.Find(p => p.PositionID != null);
return View(positions.ToList());
}
public ActionResult Index()
{
IQueryable<positions> positions = unitOfWork.PositionRepository.Find(p => p.PositionID != null);
return View(positions.ToList());
}
I have read about IEnumerable and IQueryable, I have read that IQueryable is better with linq because when you use where clauses it creates the exact query it needs, but with IEnumerable it retrieves all rows from database and then filters on memory.
The exact question here:
Is this the same?
How is the better way?
public ActionResult Index()
{
var positions = unitOfWork.PositionRepository.Find(p => p.PositionID != null);
return View(positions.ToList());
}
public ActionResult Index()
{
IQueryable<positions> positions = unitOfWork.PositionRepository.Find(p => p.PositionID != null);
return View(positions.ToList());
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
var
表示类型由编译器自动推断。基本上,如果数据源是IQueryable
(例如实体框架或Linq to SQL 数据上下文、RIA 服务等),您的变量也将是IQueryable
。如果数据源是IEnumerable
(例如内存中的对象集合),则您的变量也将是IEnumerable
。由于
IQueryable
继承自IEnumerable
,任何IQueryable
都可以被视为IEnumerable
,通过使用AsEnumerable
扩展方法。调用AsEnumerable
之后的所有内容都将在本地执行,而不是转换为数据源语言(SQL、HTTP REST...)。var
means that the type is automatically inferred by the compiler. Basically, if the data source is anIQueryable
(e.g. an Entity Framework or Linq to SQL datacontext, a RIA service, etc), your variable will also be anIQueryable
. If the data source is anIEnumerable
(e.g. an in-memory collection of objects), your variable will also be anIEnumerable
.Since
IQueryable<T>
inherits fromIEnumerable<T>
, anyIQueryable
can be treated as anIEnumerable
, by using theAsEnumerable
extension method. Everything that follows the call toAsEnumerable
will be executed locally rather than translated to the data source language (SQL, HTTP REST...).