Возникли проблемы при загрузке связанных сущностей (Eager Load) с ObjectContext.CreateQuery (Entity Framework и Repositories) - PullRequest
1 голос
/ 31 октября 2009

Вот несколько вещей, которые я попробовал ... надеюсь, вы сможете извлечь из этого то, что я пытаюсь сделать, и что я делаю неправильно. Итак, у меня возникли проблемы с загрузкой связанных объектов при использовании этого DoQuery:

   public ObjectQuery<E> DoQuery(ISpecification<E> where)
   {
        return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate);
   }

Если я просто воспользуюсь этим, я получу обратно объект, который содержит все надлежащие параметры, кроме тех, которые связаны между собой ... т.е. если один из них является идентификатором пользователя, на который ссылается таблица пользователя, я также не получаю обратно объект пользователя.

Я прочитал, что вы можете сделать .Include ("Пользователь"), чтобы сделать Eager Load объекта ... но он не работает, когда я пытаюсь это сделать:

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
     return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Include("User").Where(where.EvalPredicate);
}

Я также проверил, чтобы Имя набора сущностей и название модели были «Пользователь», что они и есть. Единственное, о чем я мог подумать, это поместить несколько вещей в ("[" + typeof(E).Name + "]"), но я не уверен, как включить в них несколько сущностей ... Вот что я пробовал, так как увидел, что кто-то сказал, что вы можете загрузить несколько, поместив , между ними.

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
     return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "].[User]").Where(where.EvalPredicate);
}

Но это не сработало ...

Если я не на правильном пути, пожалуйста, дайте мне знать. Кто-нибудь знает, как загрузить связанные объекты при использовании ObjectContext.CreateQuery? Любые предложения или понимание помогает.

Спасибо,
Matt

Ответы [ 2 ]

3 голосов
/ 02 ноября 2009

CreateQuery принимает оператор ESQL. Таким образом, вы можете написать что-то вроде:

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
    var esql = String.Concat(
         "SELECT VALUE e1 FROM OFTYPE(", 
         GetEntitySetName(typeof(E)),
         ", ", 
         typeof(T).FullName, 
         ") AS e1");
    return Context.CreateQuery<T>(esql).Include("User").Where(where.EvalPredicate);
}

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

Почему OFTYPE? Если у вас есть наследование в вашей модели, этот ESQL вернет ObjectQuery<TParent> вместо ObjectQuery<TChild> без него.

Наконец, Include работает только в том случае, если у сущности E есть свойство с именем User. Тип и имя набора сущностей не имеют значения Include.

1 голос
/ 31 октября 2009

Предыдущая версия этого ответа неверна, на что указал Крейг в комментариях. Поскольку я не могу удалить этот ответ (из-за комментариев?), Я по крайней мере постараюсь оставить что-то не так.

Предполагается, что у вас есть модель (.edmx) с двумя сущностями Product и ProductDetail. Далее, если вы хотите получить данный продукт и связанные с ним данные.

Я бы позаботился о том, чтобы выполнялись следующие работы (если у вас есть продукт с идентификатором 1, у которого есть подробные записи):

var result = ctx.CreateQuery<Product>("Products").Include("ProductDetails").Where(p => p.ProductId == 1);

В приведенном выше заявлении «ProductDetails» указывается свойство Product. Если это сработает, я бы попробовал следующее:

public ObjectQuery DoQuery<E>(Expression<Func<E, bool>> filter)
{
    string entitySetName = GetEntitySetName(typeof(T)); 
    return (ObjectQuery<E>)_ctx.CreateQuery<E>(entitySetName).Include("ProductDetails").Where(filter);
}

Обратите внимание, что GetEntitySetName () не является встроенной функцией

var result = DoQuery<Product>(p => p.ProductId == 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...