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

本文关键字:AsQueryable gt type vs lt | 更新日期: 2023-09-27 17:58:48

我在使用AsQueryable时遇到问题,我在其中发现了一些示例,即此扩展需要转换AsQueryable,在某些示例中直接转换为AsQueryable()。我向Stopwatch核实了这两起案件,并得出了几乎相同的结论,进行了多次调查。举个例子:

//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>()有什么区别,哪种是有效的?

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

当您在不指定泛型参数类型的情况下调用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()

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

在这种情况下,无论哪种方式都没有区别、优势或惩罚。类型推理只会让你的生活更轻松,代码更短。

然而,我在使用API时遇到过这样的情况,其中一个类型实现了几个接口,例如

IEnumerable<IMySimpleThing>, IEnumerable<IMyComplexThing>, IEnumerable<MyComplexThing>

如果你试图获得一个特定的接口,例如,那么类型推断是不够的

IEnumerable<MyComplexThing>

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