2 つのスカラー プロパティと 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();
ただし、複数のナビゲーション プロパティを含めたい場合は、次のようにすることができます。
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
}
ご覧のとおり、コードは反復的で乱雑になり始めています。クエリが実行される前に、ナビゲーション プロパティが要求されているかどうかにかかわらず、ナビゲーション プロパティを明示的にチェーンする方法を望んでいます。