2

何度もヒットするクエリに対してコンパイルされたクエリを使用することで、アプリを高速化していました。

私はそれを次のように実装しようとしました:

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

ただし、コンパイルされたクエリを変更して、次のようにListではなくIQueryableを返すようにした場合:

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倍高速化しました。

4

1 に答える 1

4

推測では、これは、を返すコンパイル済みクエリIQueryableが遅延ロードされる可能性があるのに対し、List強制的に返されるコンパイル済みクエリは、クラスがロードされるとき(Sharedメンバーが評価されるとき)にクエリが評価されるためです。おそらく、クラスのロード時にデータベース接続がセットアップされていないため、クエリの評価は失敗します。

の宣言をプロパティに変更しCompiledSelectShared ブレークポイントを設定して、それぞれの場合に実際に評価されるタイミングを確認してください。

于 2010-03-09T08:43:03.767 に答える