скомпилированный запрос разрешены только скалярные параметры! - PullRequest
1 голос
/ 22 января 2011

Я использую объекты POCO в EF 4 без генерации шаблона T4.

У меня есть класс DataContext, который инкапсулирует все ObjectSets, что-то вроде этого


 public sealed class DataContext :IDisposable
 {

 public IObjectSet GetObjectSet() where T : MyBase
 {

   object objectSet = null;

   this.objectSets.TryGetValue(typeof(T), out objectSet);

   if (objectSet == null)
   {
    objectSet = this.context.CreateObjectSet();
    this.objectSets.Add(typeof(T), objectSet);
   }
   return (IObjectSet)objectSet;
  }

  public ObjectContext ObjectContext
  {            
     get
       { 
       return this.context; 
      }  
  }
}

Когда я пишу следующий скомпилированный запрос и пытаюсь передать этот класс в качестве одного из параметров, он дает мне ошибку во время выполнения, говоря, что разрешены только скалярные параметры

static readonly Func<ObjectContext , DataContext, string, int?> getOperationByOrchestrationName

  = CompiledQuery.Compile(

  (ObjectContext ctx, DataContext container, string name) =>

   (from or in container.GetObjectSet<MyOrClass>()

   join op in container.GetObjectSet<MyOpClass>()

   on or.Id equals op.Id

   where op.Name == name
   select op.Id).FirstOrDefault()

  );

Если я изменяю запрос следующим образом, он работает, но я глубоко подозреваю, что он компилируется каждый раз, так как я не вижу повышения производительности, которое я вижу из скомпилированного запроса, может кто-нибудь указать, что происходит?

    static readonly Func, IObjectSet, string, IQueryable> 
   getOperationByOrchestrationName   
    = CompiledQuery.Compile(
      (ObjectContext ctx, IObjectSet ors, IObjectSet ops,string operationName) =>
       from or in ors
       join op in ops
       on or.Id equals op.Id
       where op.Name == name
       select op.Id
     );

1 Ответ

0 голосов
/ 27 января 2011

для всех, кто интересуется, если вы вернете IQueryable из скомпилированного запроса и вызовете любой из методов, которые могут изменить запрос (singleordefault или firstordefault и т. Д.), Вы не получите преимущества от скомпилированного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...