我在使用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>()有什么区别,哪种有效?

最佳答案

在不指定通用参数类型的情况下调用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()的原因。

关于c# - C#:AsQueryable()与AsQueryable <type>(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23148769/

10-09 12:37