Ho un ODataController in un'applicazione Asp.Net Web Api che consente le query OData. Permetto solo letture, non aggiornamenti. Invece di esporre direttamente il modello di dati, ho creato una serie di DTO. I nomi delle proprietà sui DTO non corrispondono necessariamente alle proprietà sul modello EF. Ciò causa un problema quando provo a utilizzare la query OData sul modello EF. Ho esaminato altri post su StackOverflow attorno a questo argomento, ma nessuno di essi sembrava risolvere questo problema.Come si associa una query OData a un DTO a un'entità EF?
Ecco quello che ho in questo momento:
public IQueryable<Customer> GetCustomer(ODataQueryOptions<Customer> query)
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Customer>("Customers");
builder.EntitySet<RECORD>("Records");
builder.Namespace = "MyDataService.Models";
var opts = new ODataQueryOptions<RECORD>(new ODataQueryContext(builder.GetEdmModel(), typeof(RECORD)), this.ActionContext.Request);
var records = (IQueryable<RECORD>)opts.ApplyTo(db.RECORDS);
return ConvertToCustomerList(records);
}
Questo funziona fino a quando non fare riferimento ai campi specifici in una selezione o filtro. Non appena faccio riferimento a un campo nella mia query OData ottengo un ODataException come - Could not find a property named 'LastName' on type 'MyDataService.Models.RECORD
. Questo perché le proprietà EF hanno una convenzione di denominazione diversa. In questo caso dovrebbe utilizzare "LAST_NAME".
Sembra che ho bisogno di analizzare la query e quindi sostituire i riferimenti di campo con i nomi corretti. Ho trovato ODataUriParser che sembra possa aiutare in questo, ma non è così pulito come speravo.
Qualcuno può fornirmi alcuni suggerimenti per risolvere questo problema? C'è un approccio migliore?
Grazie. Questo è stato estremamente utile. Al momento è disponibile solo in pre-release, ma sembra promettente. Inoltre, è possibile utilizzare gli attributi DataContract e DataMember sul modello per definire l'alias. – BenR
Inoltre, penso che la proprietà ModelAliasingEnabled sia stata deprecata con la versione più recente ma l'aliasing funziona ancora. – BenR
Questo alias può essere utilizzato anche quando si implementano query OData all'interno di un ApiController? –