Я разрабатываю службу мобильного приложения Azure для взаимодействия с моим приложением Xamarin.
Я создал, подключил и успешно заполнил базу данных SQL, но когда я пытаюсь добавить несколько фильтров в свой запрос,например, предложения orderby()
или where()
возвращают ошибку Bad Request.Например, этот запрос: https://myapp.azurewebsites.net/tables/Race?$orderby=iRound%20desc,iYear%20desc&$top=1&ZUMO-API-VERSION=2.0.0
дает мне {"message":"The query specified in the URI is not valid. Could not find a property named 'IYear' on type 'MyType'."}
.
Мой метод конфигурации такой:
HttpConfiguration config = new HttpConfiguration();
new MobileAppConfiguration()
.AddTablesWithEntityFramework()
.ApplyTo(config);
config.MapHttpAttributeRoutes();
Database.SetInitializer(new CreateDatabaseIfNotExists<MainDataContext>());
app.UseWebApi(config);
, и мой DbContext такой:
public class MainDataContext : DbContext
{
private const string connectionStringName = "Name=MS_TableConnectionString";
public MainDataContext() : base(connectionStringName)
{
Database.Log = s => WriteLog(s);
}
public void WriteLog(string msg)
{
System.Diagnostics.Debug.WriteLine(msg);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Add(
new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>(
"ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));
}
public DbSet<Race> Race { get; set; }
public DbSet ...ecc...
}
Следуя этому руководству, я добавил миграцию после создания своих TableControllers.Таким образом, TableController для приведенного выше примера довольно стандартен:
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public class RaceController : TableController<Race>
{
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
MainDataContext context = new MainDataContext();
DomainManager = new EntityDomainManager<Race>(context, Request);
}
// GET tables/Race
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<Race> GetAllRace()
{
return Query();
}
// GET tables/Race/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<Race> GetRace(string id)
{
return Lookup(id);
}
// PATCH tables/Race/48D68C86-6EA6-4C25-AA33-223FC9A27959
public Task<Race> PatchRace(string id, Delta<Race> patch)
{
return UpdateAsync(id, patch);
}
// POST tables/Race
public async Task<IHttpActionResult> PostRace(Race item)
{
Race current = await InsertAsync(item);
return CreatedAtRoute("Tables", new { id = current.Id }, current);
}
// DELETE tables/Race/48D68C86-6EA6-4C25-AA33-223FC9A27959
public Task DeleteRace(string id)
{
return DeleteAsync(id);
}
}
Как вы можете видеть, я уже пытался добавить атрибут EnableQuery в мой TableController, как это видно в Google.Я также попытался добавить эти фильтры к объекту HttpConfiguration, но безуспешно:
config.Filters.Add(new EnableQueryAttribute
{
PageSize = 10,
AllowedArithmeticOperators = AllowedArithmeticOperators.All,
AllowedFunctions = AllowedFunctions.All,
AllowedLogicalOperators = AllowedLogicalOperators.All,
AllowedQueryOptions = AllowedQueryOptions.All
});
config.AddODataQueryFilter(new EnableQueryAttribute
{
PageSize = 10,
AllowedArithmeticOperators = AllowedArithmeticOperators.All,
AllowedFunctions = AllowedFunctions.All,
AllowedLogicalOperators = AllowedLogicalOperators.All,
AllowedQueryOptions = AllowedQueryOptions.All
});
Я не знаю, что исследовать дальше, потому что, кажется, все меняется слишком быстро для новичка, такого как я, который первыйпопал в Azure.
РЕДАКТИРОВАТЬ
Я забыл сказать, что запрос полной таблицы, например, https://myapp.azurewebsites.net/tables/Race?ZUMO-API-VERSION=2.0.0
, возвращает корректно весь набор данных.Проблема возникает только при добавлении некоторых предложений в запрос.
EDIT 2
Моя модель выглядит следующим образом:
public class Race : EntityData
{
public int iRaceId { get; set; }
public int iYear { get; set; }
public int iRound { get; set; }
ecc..
}
и таблица базы данных, которая была автоматически созданаэто, включая все свойства, унаследованные от EntityData:
Схема таблицы базы данных