【问题标题】:C# : AsQueryable() vs AsQueryable<type>()C#:AsQueryable() 与 AsQueryable<type>()
【发布时间】:2014-06-02 15:32:10
【问题描述】:

我在使用 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&lt;type&gt;() 有什么区别,哪个更高效?

【问题讨论】:

    标签: c# linq asqueryable


    【解决方案1】:

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

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

    等价于

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

    更新

    回答 cmets 中提出的问题:

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

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

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

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

    【讨论】:

    • 那么两种不同的方式有什么用呢?有没有什么特别的情况我们只能使用其中一种?
    • @Bharadwaj 如果在编译时无法从用法中推断出类型参数,则必须明确指定它。
    • @HamletHakobyan 你能提供任何例子吗?
    【解决方案2】:

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

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

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

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

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

    IEnumerable<MyComplexThing>
    

    所以在这种情况下,为泛型指定类型,如 .AsQueryable&lt;MyComplexThing&gt;(),就可以解决问题。

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2012-06-16
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多