Ошибка при добавлении предложений Where или OrderBy в запрос мобильных приложений Azure - PullRequest
0 голосов
/ 09 июля 2019

Я разрабатываю службу мобильного приложения 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:

Схема таблицы базы данных

...