2

我在使用时遇到问题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>()和 哪个是有效的有什么区别?

4

2 回答 2

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()这就是为什么大多数时候你可能会看到没有类型参数。

于 2014-04-18T06:43:08.097 回答
4

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

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

但是,在使用类型实现多个接口的 API 时,我遇到过一些情况,例如

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

如果您尝试访问特定接口,则类型推断是不够的,例如

IEnumerable<MyComplexThing>

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

于 2014-04-18T06:43:48.427 回答