关于AsEnumerable()行为

时间:2014-05-27 12:37:45

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

我有一个ASP.NET MVC应用程序。让我们假设我有这个观点:

@model IEnumerable<MyClass>
   .....

在服务器端,我有一个linq查询到我的数据库,使用EF:

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()有用时,有人可以解释一下吗?

谢谢,抱歉我的英文不好!

1 个答案:

答案 0 :(得分:1)

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

正如您将看到here,实现Select的类型的IEnumerable扩展方法会返回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的public Where方法。表示数据库表的表类型可以具有Where方法,该方法将谓词参数作为表达式树并将树转换为SQL以进行远程执行。如果不需要远程执行,例如因为谓词调用本地方法,则AsEnumerable方法可用于隐藏自定义方法,而是使标准查询运算符可用。

如需进一步的文档,请查看here