2015-03-23 3 views
0

У меня есть отношение от одного до другого, как описано ниже. В некоторых частях бизнес-уровня есть запросы в таблице «Элемент», а в других - таблица «Клиент» (а также ее элементы). LazyLoading и ProxyCreation являются ложными, обработка эталонных циклов задана для игнорирования.Возврат подмножества объекта недвижимости для навигации

public class Client { 
public virtual ICollection<Item> Items { get; set; } 
public string Name {get;set;} 
} 

public class Item { 
    public virtual Client TheClient {get;set;} 
    public string ItemProp {get;set;} 
    // another 10 properties or so 
} 

myitems = dbContextScopeX.Items.Include(x => x.Client).ToList(); 

В представлении есть список предметов с указанием имени клиента (в моем примере). Ищу item.Client.Name Ultimate, однако, когда myitems получает запросы/сериализовать содержит:

myitems.Client.Items 

Если установить атрибут [JsonIgnore] на свойства элемента клиента он никогда не приходит через граф, который мне нужен это в других местах. Есть ли способ получить myItems.Client.Name без необходимости получать myitems.Client.Items в запросе или не создавать анонимную проекцию для массива Item?

+0

Вы пробовали проецировать анонимный тип, который исключает сбор элементов и сериализацию этого типа? –

+0

Я упростил пример. В моем проекте элементы имеют другие свойства навигации, которые спускаются на пару уровней. Кроме того, я знаю, что могу использовать ClientID, который возвращается в класс Item и просматривает его, но я хотел посмотреть, есть ли более простой способ получить имя. – lucuma

+0

Еще одна вещь, которую вы можете попробовать, - это просто обнулить коллекцию Items на клиенте (или установить ее в пустой список) перед сериализацией. Просто убедитесь, что вы не пытаетесь сделать что-либо еще с этим DbContext, прежде чем уничтожить его, поскольку отношения между сущностями будут все в порядке. Это звучит для меня как довольно хакерский и нецелесообразный способ достижения вашей цели, но это может сработать. –

ответ

0

Проецировать свойства объекта, которые вы хотите (будь то простые или сложные), а также только имя Клиента в анонимный тип и сериализовать это.

myitems = dbContextScopeX.Items.Include(x => x.Client) 
    .Select(i=>new { 
     ItemProp = i.ItemProp, 
     ItemCollection = i.ItemCollection, 
     ... 
     ClientName = i.Client.Name 
    }).ToList(); 

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

+0

Спасибо, что заметили оговорку, я пытался избежать необходимости вручную создавать анонимный объект, хотя ваш ответ определенно работает. Посмотрим, смогу ли я получить другие ответы. – lucuma

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