2016-04-10 13 views
0

sağlamak için bir WebAPI 2 OData v4 denetleyicisi uzatmak için nasıl 2/Varlık Çerçeve 6/OData v4 servisi, şu basit denetleyicisi var:düzgün otomatik ilgili varlık koleksiyonları benim WebAPI olarak

public class InformationProductController : ODataController 
    { 
     GCIMContext db = new GCIMContext(); 

     protected override void Dispose(bool disposing) 
     { 
      db.Dispose(); 
      base.Dispose(disposing); 
     } 

     [EnableQuery] 
     public IQueryable<InformationProduct> Get() 
     { 
      return db.InformationProducts; 
     } 
    } 

Benim InformationProduct varlık vardır tip DataEntity çocuk birimlerin bir koleksiyon:

public partial class InformationProduct 
    { 
     public InformationProduct() 
     { 
      this.AnalyticalMethods = new List<AnalyticalMethod>(); 
      this.DataEntities = new List<DataEntity>(); 
      this.BusinessEntities = new List<BusinessEntity>(); 
      this.SourceTools = new List<SourceTool>(); 
     } 

     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public Nullable<int> Governance_ID { get; set; } 
     public Nullable<int> PerformanceMetric_ID { get; set; } 
     public virtual ICollection<AnalyticalMethod> AnalyticalMethods { get; set; } 
     public virtual ICollection<DataEntity> DataEntities { get; set; } 
     public virtual Governance Governance { get; set; } 
     public virtual PerformanceMetric PerformanceMetric { get; set; } 
     public virtual ICollection<BusinessEntity> BusinessEntities { get; set; } 
     public virtual ICollection<SourceTool> SourceTools { get; set; } 
    } 

DataEntity, sırayla, tip DataSource çocuk birimlerin bir koleksiyona sahiptir:

public partial class DataEntity 
    { 
     public DataEntity() 
     { 
      this.PerformanceMetrics = new List<PerformanceMetric>(); 
      this.DataAttributes = new List<DataAttribute>(); 
      this.BusinessEntities = new List<BusinessEntity>(); 
      this.DataDeliveryChannels = new List<DataDeliveryChannel>(); 
      this.DataSources = new List<DataSource>(); 
      this.MasterDatas = new List<MasterData>(); 
      this.SourceTools = new List<SourceTool>(); 
      this.SubjectAreas = new List<SubjectArea>(); 
      this.Udms = new List<Udm>(); 
     } 

     public int ID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public Nullable<int> InformationProduct_ID { get; set; } 
     public Nullable<int> BiMeasure_ID { get; set; } 
     public Nullable<int> BiFact_ID { get; set; } 
     public Nullable<int> BiDimension_ID { get; set; } 
     public virtual BiDimension BiDimension { get; set; } 
     public virtual BiFact BiFact { get; set; } 
     public virtual BiMeasure BiMeasure { get; set; } 
     public virtual InformationProduct InformationProduct { get; set; } 
     public virtual ICollection<PerformanceMetric> PerformanceMetrics { get; set; } 
     public virtual ICollection<DataAttribute> DataAttributes { get; set; } 
     public virtual ICollection<BusinessEntity> BusinessEntities { get; set; } 
     public virtual ICollection<DataDeliveryChannel> DataDeliveryChannels { get; set; } 
     public virtual ICollection<DataSource> DataSources { get; set; } 
     public virtual ICollection<MasterData> MasterDatas { get; set; } 
     public virtual ICollection<SourceTool> SourceTools { get; set; } 
     public virtual ICollection<SubjectArea> SubjectAreas { get; set; } 
     public virtual ICollection<Udm> Udms { get; set; } 
    } 

aşağıdaki OData sorgu Postacı, Fiddler iyi çalışır ve herhangi bir modern tarayıcı:

GET http://10.0.0.4:8080/InformationProduct?$expand=DataEntities($expand=DataSources) 

bu sorgunun sonucudur:

{ 
    "@odata.context":"http://10.0.0.4:8080/$metadata#InformationProduct","value":[ 
    { 
     "ID":1,"Name":"ODM Dashboard","Description":"ODM Dashboard","Governance_ID":1,"PerformanceMetric_ID":1,"DataEntities":[ 
     { 
      "ID":1,"Name":"Data Entity 1","Description":"Data Entity 1","InformationProduct_ID":1,"BiMeasure_ID":null,"BiFact_ID":null,"BiDimension_ID":1,"DataSources":[ 
      { 
       "ID":40,"Category":"Service Performance","SourceSystemName":"Account Improvement Plan","SourceSystemOwner":null,"SourceSystemLocation":null,"SourceSystemTeam":null,"SourceSystemNetworkSegment":null,"SourceSystemOsType":null,"SourceDatabaseName":null,"SourceDatabaseType":null,"SourceDatabaseVersion":null,"BiFact_ID":null 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

Ben herhangi bir JavaScript bulamadı yana iç içe geçmiş bir $expand operatörünü ifade edebilen kütüphaneler, şimdi API'ma dönüyorum ve InformationModel koleksiyonunu, kendi e ile birlikte gelecek olan genişletilmiş DataEntities koleksiyonunu tedarik etmesini istiyorum xpanded DataSources collection - yukarıda gösterilen sorguda olduğu gibi.

Soruma ilişkin soru: IQueryable sonucumu hem DataEntities hem de DataSources koleksiyonunu içerecek şekilde genişletmek için hangi sözdizimini kullanmalıyım?

cevap

1

Eğer AutoExpand özniteliği ile DataEntities ve DataSources özelliklerini açıklama edebileceğinden çok daha sen Microsoft.AspNet.OData sürümü 5.7 veya daha kullanıyorsanız.

GET http://10.0.0.4:8080/InformationProduct 
+0

Ben DBContext içinde AutoExpend başvurmalıdır: Bu istemci üzerinde $expand gereksiz hale getirecek [AutoExpand] kamu DbSet DataEntities {get; set; } ya da başka bir yerde? –

+0

Veri modelinizdeki özelliklere AutoExpand özelliğini kullanın; Örneğin, InformationProduct 'sınıfının' DataEntities' özelliği. – lencharest