2013-04-12 99 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

對不起,根據你的帖子最初的措辭,我認爲你的問題是關於如何從序列化響應中省略空屬性。看起來你真正要問的是如何根據給你的方法提供什麼參數來改變你在實體框架查詢中包括的內容。 –