我有包含两个标量属性和两个导航属性以下实体类排除/包含导航属性
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}
我的问题是,我将如何去从响应字符串中排除导航属性,但我仍然能够包含导航属性,当它们不是null或是必需的。
理想我愿做这样的事情,包括导航性能
http://somewebsite.com/api/artist?id=1&bucket=genres&bucket=images
但是如果该URL是不继续任何桶参数则响应不应包含任何相应的导航性能。
更新
我想通了一种通过结果映射到一个匿名类型省略属性(我可以用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属性的方法。 –
对不起,根据你的帖子最初的措辞,我认为你的问题是关于如何从序列化响应中省略空属性。看起来你真正要问的是如何根据给你的方法提供什么参数来改变你在实体框架查询中包括的内容。 –