2013-04-12 100 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} 

我的问题是,我将如何去从响应字符串中排除导航属性,但我仍然能够包含导航属性,当它们不是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 
} 

正如你所看到的,代码开始变得重复和凌乱。我希望能够明确地链接到导航属性,不管它们是否已经被请求或者在查询被执行之前。

回答

2

Asp.Net Web API使用Json.Net在幕后执行JSON序列化。在这种情况下,您可以将序列化程序设置为忽略空属性值。换句话说,当一个属性的值为null时,它将不会出现在输出中。

要做到这一点,下面的行添加到该文件夹​​App_Start的WebApiConfig.cs文件:

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

然后,您可以使用您方法的URL参数,如你所说,以确定是否要设置这些属性值在你的对象上,因此有选择地将它们包含在响应中。

+0

我已经在WebAPIConfig内设置了该行,并且它有助于序列化null属性,但它并没有真正给我一种省略null属性的方法。 –

+0

对不起,根据你的帖子最初的措辞,我认为你的问题是关于如何从序列化响应中省略空属性。看起来你真正要问的是如何根据给你的方法提供什么参数来改变你在实体框架查询中包括的内容。 –