【问题标题】:About AsEnumerable() behavior关于 AsEnumerable() 行为
【发布时间】:2014-05-27 12:37:45
【问题描述】:

我有一个 ASP.NET MVC 应用程序。假设我有这样的看法:

@model IEnumerable<MyClass>
   .....

在服务器端,我使用 EF 对我的数据库进行 linq 查询:

public ActionResult Index()
{
    var query = from t in context.MyClass
                select t;

    //now comes the question
    return View(query);
    return View(query.AsEnumerable()); //is there any difference?
}

我认为 AsEnumerable() 不是必需的,因为查询会自动转换为它,所以,有人可以解释一下 AsEnumerable() 什么时候有用吗?

谢谢!

【问题讨论】:

  • 你认为基本上是正确的——查询已经返回了一个实现IEnumerable的对象。但是请参阅这些线程:onetwo 了解有关 AsEnumerable(和 AsQueryable 顺便说一句)的详细信息

标签: asp.net-mvc linq entity-framework


【解决方案1】:

没有必要。您声明的查询会产生一个序列,该序列实现了IEnumerable 接口。

正如您将看到的here,实现IEnumerable 的类型的Select 扩展方法返回IEnumerable

public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector)

您的查询

var query = from t in context.MyClass
            select t;

将被编译为

var query = context.MyClass.Select(x=>x);

因此我指的是Select 扩展方法。

关于现在AsEnumerable()的使用

AsEnumerable(IEnumerable) 方法没有任何作用,只是将源的编译时类型从实现 IEnumerable 的类型更改为 IEnumerable 本身。

还有

AsEnumerable(IEnumerable) 可用于当序列实现 IEnumerable 但也有一组不同的公共查询方法可用时在查询实现之间进行选择。例如,给定一个实现 IEnumerable 并拥有自己的方法(如 Where、Select 和 SelectMany)的泛型类 Table,对 Where 的调用将调用 Table 的公共 Where 方法。表示数据库表的 Table 类型可以具有 Where 方法,该方法将谓词参数作为表达式树并将树转换为 SQL 以进行远程执行。如果不需要远程执行,例如因为谓词调用本地方法,则可以使用 AsEnumerable 方法隐藏自定义方法,而是使标准查询运算符可用。

如需更多文档,请查看here

【讨论】:

  • 您粘贴的最后一段似乎与您所说的和 OP 的假设相矛盾。除非您知道 View() 不会调用 SelectWhere 等,否则可能会运行不同的查询实现,这可能很重要。
  • 你提出论点的方式是有道理的。但是,OP 使用实体框架来访问数据库。因此,实体框架创建的实体类如果使用数据库优先的方法,或者他构建的实体类,如果他使用代码优先的方法,则没有Where、Select等方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多