我有一个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()有用时,有人可以解释一下吗?
谢谢,抱歉我的英文不好!
答案 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。