【问题标题】:Why can't you return a List from a Compiled Query?为什么不能从编译查询返回列表?
【发布时间】:2010-03-09 06:19:43
【问题描述】:

我正在通过使用编译后的查询来加速我的应用程序,这些查询一次又一次地受到打击。

我尝试这样实现它:

Function Select(ByVal fk_id As Integer) As List(SomeEntity)
    Using db As New DataContext()
        db.ObjectTrackingEnabled = False
        Return CompiledSelect(db, fk_id)
    End Using
End Function

Shared CompiledSelect As Func(Of DataContext, Integer, List(Of SomeEntity)) = _
    CompiledQuery.Compile(Function(db As DataContext, fk_id As Integer) _
         (From u In db.SomeEntities _
          Where u.SomeLinkedEntity.ID = fk_id _
          Select u).ToList())

这不起作用,我收到以下错误消息:

Type : System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Value cannot be null.
Parameter name: value

但是,当我将编译后的查询更改为返回 IQueryable 而不是 List 时:

Function Select(ByVal fk_id As Integer) As List(SomeEntity)
    Using db As New DataContext()
        db.ObjectTrackingEnabled = False
        Return CompiledSelect(db, fk_id).ToList()
    End Using
End Function

Shared CompiledSelect As Func(Of DataContext, Integer, IQueryable(Of SomeEntity)) = _
    CompiledQuery.Compile(Function(db As DataContext, fk_id As Integer) _
         From u In db.SomeEntities _
         Where u.SomeLinkedEntity.ID = fk_id _
         Select u)

效果很好。谁能解释这是为什么?

顺便说一句,编译后的查询非常棒!他们将我的应用程序加速了 2 倍。

【问题讨论】:

    标签: vb.net linq-to-sql compiled-query


    【解决方案1】:

    猜测,这可能是因为返回 IQueryable 的已编译查询可以延迟加载,而返回 List 的已编译查询强制在加载类时评估查询(即当Shared 成员被评估时)。很可能,在类加载时,您的数据库连接未建立,因此查询评估失败。

    尝试将CompiledSelect 的声明更改为Shared 属性,并在其中放置一个断点以查看每种情况下实际评估的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      • 2021-04-29
      • 2019-01-08
      相关资源
      最近更新 更多