1

Вот куча вещей, которые я пробовал ... надеюсь, вы можете экстраполировать из нее то, что я пытаюсь сделать, и что я делать неправильно. Хорошо, таким образом у меня возникли проблемы с загрузкой связанных лиц при использовании этого DoQuery:Проблемы, связанные с загрузкой связанных объектов (Eager Load) с ObjectContext.CreateQuery (Entity Framework и репозитории)

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

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

Я дочитал, что вы можете сделать .INCLUDE («User»), чтобы сделать нетерпеливые нагрузки хозяйствующего субъекта ... но она не работает, когда я пытаюсь это:

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

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

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

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

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

Спасибо,
Matt

ответ

1

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

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

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

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

В Include заявлении выше, «Детали изделия» является собственностью на продукт. Если это работает, я хотел бы попробовать следующее:

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); 
+0

Я до сих пор не получаю возвращаемые пользователем объекты ... Я поместил разрывы на эти строки и проверил, что там введены правильные имена сущностей. – Matt

+0

Если вы развернете «Результат результатов» запроса в визуализаторе отладки, у вас есть свойство «Пользователи». Когда вы расширяете это, вы получаете количество пользователей? –

+0

Нет, это просто говорит null – Matt

3

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 это метод вы пишете, который возвращает имя набора строк сущностей для вашего типа лица, или использовать eager loading strategy.

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

И, наконец, Include работает только в том случае, если предприятие E имеет имущество с именем User. Тип и имя объекта не имеют отношения к Include.

 Смежные вопросы

  • Нет связанных вопросов^_^