2013-04-12 9 views
2

У меня есть следующий класс сущностей, который содержит два скалярных свойств и два навигационных свойстваБез учета/включая навигационные свойства

public class Artist 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public ICollection<ArtistGenre> ArtistGenres { get; set; } 

    public ICollection<ArtistImage> ArtistImages { get; set; } 
} 

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

using (var revrbContext = new RevrbContext()) 
{ 
    var response = revrbContext.Artists.Find(1); 

    return Request.CreateResponse(HttpStatusCode.OK, response); 
} 

И данные ответа действительно будут выглядеть следующим образом:

{"Id":1,"Name":"Test","ArtistGenres":null,"ArtistImages":null} 

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

В идеале я хотел бы сделать что-то вроде этого, чтобы включить навигационные свойства

http://somewebsite.com/api/artist?id=1&bucket=genres&bucket=images 

Однако, если URL были не продолжать какие-либо параметры ковшеобразные, то ответ не должен содержать соответствующие навигационные свойства.

Update

я понял способ опускаем свойств путем сопоставления результатов анонимного типа (я мог бы использовать DTO, а), но до сих пор не удалось выяснить, чистый способ включает в себя навигационные свойства, когда они требуется

Картирования типа сущности и один навигационного свойства анонимного типа:

var response = 
await 
revrbContext.Artists.Include("ArtistGenres.Genre") 
      .Where(artist => artist.Id == 1) 
      .Select(artist => new 
       { 
        artist.Id, 
        Genre = artist.ArtistGenres.Select(
             article => new {article.Genre.Name}) 
       }).FirstOrDefaultAsync(); 

Однако, если бы я хотел включить несколько навигации пропеллера erties я мог бы что-то вроде этого:

if (bucket.Contains("images") && bucket.Contains("genres")) 
{ 
    var response = 
     await 
     revrbContext.Artists.Include("ArtistArticles.Article") 
           .Include("ArtistImages.Image") 
           ...etc 
} 

if (bucket.Contains("images")) 
{ 
    var response = 
     await 
     revrbContext.Artists.Include("ArtistImages.Image") 
          ...etc 
} 

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

ответ

2

Asp.Net Web API использует Json.Net за кулисами для сериализации JSON. В этом случае вы можете установить сериализатор для игнорирования значений свойств null. Другими словами, когда значение свойства равно null, оно не будет присутствовать в выходе.

Чтобы сделать это, добавьте следующую строку в файл WebApiConfig.cs в папке App_Start:

config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = 
    Newtonsoft.Json.NullValueHandling.Ignore; 

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

+0

У меня уже есть эта строка, установленная внутри WebAPIConfig, и хотя она помогает сериализовать нулевые свойства, это на самом деле не дает мне возможности опустить свойства null. –

+0

Извините, в зависимости от того, как ваше сообщение было изначально написано. Я думал, ваш вопрос был о том, как опустить свойства null из сериализованного ответа. Кажется, что вы действительно спрашиваете, как изменить то, что вы включаете в ваш запрос на инфраструктуру сущности, на основе того, какие параметры даны вашему методу. –

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