首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#:AsQueryable()与AsQueryable<type>()

C#:AsQueryable()与AsQueryable<type>()
EN

Stack Overflow用户
提问于 2014-04-17 22:36:38
回答 2查看 1.6K关注 0票数 2

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

代码语言:javascript
运行
AI代码解释
复制
//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>()有什么区别,哪个是有效的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-17 22:43:08

当您调用AsQueryable()而不指定泛型参数类型时,编译器将从调用它的对象推断它。

代码语言:javascript
运行
AI代码解释
复制
var source = new List<int>();
var queryable = source.AsQueryable();  // returns IQueryable<int>

等于

代码语言:javascript
运行
AI代码解释
复制
var queryable = source.AsQueryable<int>();

更新

要回答评论中提出的问题:

那么,有两种不同的方式有什么用呢?当我们只使用其中一种时,有什么特殊情况吗?

是的,在使用匿名类型时不能显式指定类型参数,因为您没有类名:

代码语言:javascript
运行
AI代码解释
复制
source.Select((x,i) => new { Value = x, Index = i }).AsQueryable();

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

票数 6
EN

Stack Overflow用户

发布于 2014-04-17 22:43:48

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

在这种情况下,无论哪种方式,都没有区别、优势或点球。类型推断只会使您的生活更轻松,代码更短。

但是,我在使用API时遇到了这样的情况:类型实现了多个接口,例如,

代码语言:javascript
运行
AI代码解释
复制
IEnumerable<IMySimpleThing>, IEnumerable<IMyComplexThing>, IEnumerable<MyComplexThing>

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

代码语言:javascript
运行
AI代码解释
复制
IEnumerable<MyComplexThing>

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23148769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档