Azure Хранение таблиц - Запрос Где вернуть другие данные - PullRequest
0 голосов
/ 20 апреля 2020

Я не уверен, почему, но я запрашиваю базу данных с предикатом City = London, но я получаю сущности с разными значениями

Вот моя модель данных:

public class MyEntity : TableEntity
{

    public MyEntity()
    {
    }

    public MyEntity(string partitionKey, string rowKey) : base(partitionKey, rowKey)
    {
    }

    public string City { get; set; }

    public string Year { get; set; }
}

Мой запрос:

var query = new TableQuery<KomisEntity>()
            .Where(TableQuery.GenerateFilterCondition("City", QueryComparisons.Equal, "London"))
            .Where(TableQuery.GenerateFilterCondition("Year", QueryComparisons.Equal, "2000"));

var data = await LoadWhereAsync(table, query);

Вспомогательный метод:

private static async Task<List<T>> LoadWhereAsync<T>(CloudTable table, TableQuery<T> query) where T : TableEntity, new()
{
    var entities = new List<T>();


    TableContinuationToken continuationToken = null;
    do
    {
        var page = await table.ExecuteQuerySegmentedAsync(query, continuationToken);
        continuationToken = page.ContinuationToken;
        entities.AddRange(page);
    }
    while (continuationToken != null);

    return entities;
}

Но по какой-то причине я получаю объекты, например:

City: 'South Pierceberg'

Заранее спасибо

1 Ответ

1 голос
/ 21 апреля 2020

Проблема связана с вашим фильтром запросов:

var query = new TableQuery<KomisEntity>()
            .Where(TableQuery.GenerateFilterCondition("City", QueryComparisons.Equal, "London"))
            .Where(TableQuery.GenerateFilterCondition("Year", QueryComparisons.Equal, "2000"));

Это должно сгенерировать фильтр or, подобный этому city==London or Year==2000.

Вы можете попробовать приведенный ниже код, который использует and фильтр:

string filter = "(City eq 'London') and (Year eq '2000')";
var query = new TableQuery<KomisEntity>().Where(filter);

или используйте этот формат запроса:

var query = new TableQuery<KomisEntity>().Where(
                        TableQuery.CombineFilters(
                            TableQuery.GenerateFilterCondition("City", QueryComparisons.Equal, "London"),
                            TableOperators.And,
                            TableQuery.GenerateFilterCondition("Year", QueryComparisons.Equal, "2000")
                            )
                    );
...