У меня есть следующий класс сущностей, который содержит два скалярных свойств и два навигационных свойстваБез учета/включая навигационные свойства
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
}
Как вы можете видеть, код начинает получать повторяющиеся и грязно. Я надеюсь на то, что явным образом свяжусь с свойствами навигации, были ли они запрошены или нет до выполнения запроса.
У меня уже есть эта строка, установленная внутри WebAPIConfig, и хотя она помогает сериализовать нулевые свойства, это на самом деле не дает мне возможности опустить свойства null. –
Извините, в зависимости от того, как ваше сообщение было изначально написано. Я думал, ваш вопрос был о том, как опустить свойства null из сериализованного ответа. Кажется, что вы действительно спрашиваете, как изменить то, что вы включаете в ваш запрос на инфраструктуру сущности, на основе того, какие параметры даны вашему методу. –