2010-03-09 2 views
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()) 

작동하지 않았다 나는이 오류 메시지가 있어요 : 내가 대신 된 IQueryable를 반환하는 내 컴파일 된 쿼리를 변경할 때

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

을, 목록은 이렇게 :

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) 

괜찮 았어. 왜 이것이 빛인지 밝힐 수 있습니까?

댓글이 게시되었습니다. 그들은 List을 반환 컴파일 된 쿼리, 반면 IQueryable 게으른로드 할 수 있습니다 반환 컴파일 된 쿼리가 평가되는 쿼리를 강제하기 때문에이 될 수있다, 추측 2.

답변

3

의 요인에 의해 내 응용 프로그램을 가속화 클래스가로드 될 때 (Shared 멤버가 평가 될 때). 아마도 클래스로드 시간에 데이터베이스 연결이 설정되지 않았으므로 쿼리 평가가 실패합니다.

Shared 속성에 CompiledSelect 선언 변경 시도하고, 실제로 각각의 경우에 평가 될 때 참조하는 데에 중단 점을 넣어.