C#:AsQueryable()vs AsQueryable <type>()</type>

时间:2014-04-18 06:36:38

标签: c# linq asqueryable

我在使用AsQueryable时遇到问题,我找到了一些示例,其中此扩展需要进行转换,即AsQueryable,在某些示例中直接作为AsQueryable()。我用秒表检查这两个案子,并得出几乎相同的结果进行多次调查。 让我们举个例子:

//With AsQueryable()
var studentId = dbContext.Students.AsQueryable().Where(a=>a.Name == "Abc").Select(a=>a.Id).FirstOrDefault();

//With AsQueryable<Student>()
var studentId = dbContext.Students.AsQueryable<Student>().Where(a=>a.Name == "Abc").Select(a=>a.Id).FirstOrDefault();

使用AsQueryable()AsQueryable<type>()之间有什么区别?哪个有效?

2 个答案:

答案 0 :(得分:6)

当你在没有指定通用参数类型的情况下调用AsQueryable()时,编译器会从你调用它的对象中推断它。

var source = new List<int>();
var queryable = source.AsQueryable();  // returns IQueryable<int>

相当于

var queryable = source.AsQueryable<int>();

更新

回答评论中提出的问题:

  

那么有两种不同的方式有什么用?当我们只使用其中一个时,是否有任何特殊情况?

是的,您在使用匿名类型时无法明确指定类型参数,因为您没有类名:

source.Select((x,i) => new { Value = x, Index = i }).AsQueryable();

这正是引入类型推断的原因:让您在使用匿名类型时调用泛型方法而不指定类型参数。但是因为它不仅适用于匿名类型,并且可以节省您不必要的打字,所以只要有可能就依赖类型推断是很常见的。这就是为什么您在大多数情况下可能会看到AsQueryable()没有类型参数的原因。

答案 1 :(得分:4)

只要有可能,编译器就可以为您做类型推断: http://msdn.microsoft.com/en-us/library/twcad0zb.aspx

在这种情况下,无论如何都没有区别,优势或惩罚。类型推断只会让您的生活更轻松,代码更短。

但是,在使用API​​时,我会遇到一些案例,其中类型实现了几个接口,例如:

IEnumerable<IMySimpleThing>, IEnumerable<IMyComplexThing>, IEnumerable<MyComplexThing>
如果您尝试进入特定界面,

并且类型推断是不够的,例如

IEnumerable<MyComplexThing>

因此,在这种情况下,指定泛型的类型,如.AsQueryable<MyComplexThing>(),就可以了。

相关问题