2017-02-22 52 views
1

В настоящее время я работаю над проектом веб-сервиса в asp.net. И я пытаюсь включить дочерние элементы в свою функцию, которая извлекает данные.Как расширить дочерние уровни дочерних элементов с помощью AutoMapper и OData?

Он работает с URL:

http://localhost:8080/myEntity/?$expand=myChildElement 

Но я не могу включать дочерние элементы уровня ниже, как это:

http://localhost:8080/myEntity/?$expand=myChildElement/mySubChildElement 

Вот моя функция:

public virtual async Task<IHttpActionResult> GetElements(ODataQueryOptions<TEntity> queryOptions) 
{ 
    IQueryable<TPoco> query = context.Set<TPoco>(); 

    string[] includes = null; 
    string includeText = queryOptions.SelectExpand != null ? queryOptions.SelectExpand.RawExpand : null; 
    if(! string.IsNullOrEmpty(includeText)) 
    { 
     includes = queryOptions.SelectExpand.RawExpand.Split(','); 
     return Ok(await query.ProjectTo<TEntity>(null, includes).ToListAsync()); 
    } 

    return Ok(await query.ProjectTo<TEntity>().ToListAsync()); 
} 

И вот пример моей модели TPoco (myChildElement может быть объектом «Проект» и mySubChildElement дочернее предприятие «ProjectType»):

public class ContractEntity : BaseEntity 
{ 
    public ContractEntity() 
    { 
     this.Addresses = new HashSet<AddressEntity>(); 
    } 

    override public Guid Id { get; set; } 
    override public string DisplayName { get { return No.ToString(); } set { } } 
    override public string ClassType { get { return "Contract"; } set { } } 
    override public string MarkerColor { get { return Colors.Green.ToString(); } set { } } 
    public int? No { get; set; } 
    public DateTime? OfficialDate { get; set; } 
    public DateTime? ValidDate { get; set; } 
    public DateTime? SignatureDate { get; set; } 
    public Guid? ProjectId { get; set; } 
    [...] 

    public virtual ICollection<AccountingItemEntity> AccountingItems { get; set; } 
    public virtual ICollection<TagEntity> Tags { get; set; } 
    public virtual ProjectEntity Project { get; set; } 
    [...] 
} 

Надеюсь, вы можете мне помочь.

+0

Duplicate? https://stackoverflow.com/questions/14058485/c-sharp-odata-expand-n-level-with-sub-entities?rq=1 –

+0

@ShaneRay: Я думаю, что нет. Я понимаю систему OData, но я хочу включить ее в свою функцию GetElements. –

+0

Я думаю, вам может понадобиться заменить '/' на '.' В вашей функции. Это означает, что вы передаете 'myChildElement.mySubChildElement' метод' ProjectTo'. Кроме того, это возможно с учетом регистра, поэтому убедитесь, что ваш корпус правильно. –

ответ

1

Как я сделать это, я использую тот факт, что .ProjectTo возвращает IQueryable так я позволяю OData рамки ручка запрашиванию, не называя ToListAsync() себя, но возвращением IQueryable.

// In some class that is ': ODataController' 
[EnableQuery] //Attribute makes sure the OData framework handles querying 
public IQueryable<TDto> Get(ODataQueryOptions<TDto> options) { 
    //The names of the properties requested by the client in the '$expand=' query option 
    string[] requestedExpands = Helpers.Expand.GetMembersToExpandNames(options); // I made a helper for this, you can probably just use your code 

    var set = Db.Set<TEntity>().AsNoTracking(); //You might want to remove AsNoTracking if it doesn't work 
    var converted = set.ProjectTo<TDto>(MapConfig, null, requestedExpands); 
    return converted; 
} 

В этом примере TDto типа я хочу отправить клиенту TEntity класса Entity Framework ПОКО.

Моего MapConfig I установки при запуске приложения, здесь я установил расширяемых свойства «Явная расширению» Режим:

MapConfig = new MapperConfiguration(cfg => { 
    cfg.CreateMap<EFType, DTOType>(MemberList.Destination) 
     .ForMember(c => c.ExpandableProperty, options => options.ExplicitExpansion()); 
}); 

Как я уже говорил в комментариях, я запросить данные по гнездованию $expand= в URL:

api/myEntity?$expand=myChildElement($expan‌​d=mySubChildElement) 

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

EDIT: Посмотрел на нее еще раз, если вы хотите расширить myEntity.myChildElement.mySubChildElement в string[] «requestedExpands» вы передаете в AutoMapper должен содержать 1 запись: myChildElement.mySubChildElement. И у меня есть отображение, определенное для всех трех объектов, опять же с опцией ExplicitExpansion.

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

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