Запрос azure строк хранилища таблиц с использованием моего пользовательского лямбда-выражения - PullRequest
0 голосов
/ 19 июня 2020

Я создаю метод, принимающий на входе лямбда-выражение:

Task<IEnumerable<T>> GetAsync<T>(Expression<Func<T, bool>> predicate) where T : MyCustomEntity;

Метод (должен) делать запрос в azure хранилище таблиц:

public async Task<IEnumerable<T>> GetAsync<T>(Expression<Func<T, bool>> predicate)
    where T : MyCustomEntity
{
    TableQuery<DynamicTableEntity> query = // ... //Here I need something
    IEnumerable<DynamicTableEntity> azureEntities = this._table.ExecuteQuery<DynamicTableEntity>(query);

    IList<T> result = new List<T>();

    //...

    return result;
}

Вкратце, у меня есть 2 способа создать Table Query:

  1. new TableQuery<DynamicTableEntity>().Where(string filter);
  2. new TableQuery<DynamicTableEntity>().Where(Expression<Func<DynamicTemplateEntity, bool>> predicate);

первый мне не очень нравится ... но он почти работает. Я должен перевести выражение lmbda в выражение запроса таблицы. Это означает что-то в этом роде (я думаю, что могу лучше работать с посетителями .. но теперь я хочу, чтобы он работал):

internal static TableQuery<DynamicTableEntity> ToTableQuery<T, TResult>(this Expression<Func<T, TResult>> predicate)
{
    ExpressionComparionsVisitor v = new ExpressionComparionsVisitor();
    v.Modify((Expression)predicate);


    string exp = predicate.Body.ToString().Replace($"{predicate.Parameters[0]}.", "");
    exp = exp.Replace("==", QueryComparisons.Equal);
    exp = exp.Replace("OrElse", TableOperators.Or);
    exp = exp.Replace("\"", "'");
    exp = exp.Replace("AndAlso", TableOperators.And);

    ......

    TableQuery<DynamicTableEntity> query = new TableQuery<DynamicTableEntity>().Where(predicate);

    return query;
}

Проблема с DateTime ... Этот код не работает, когда лямбда выражение содержит Datetime (т.е. myClass => myClass.Date == DateTime.Now).

Второй вариант, я думаю, лучше ... но я не знаю, как преобразовать epression. У меня есть метод, который правильно работает для преобразования из T в DynamicTableEntity. Но я не знаю, как я могу использовать его для преобразования T в выражении ... Я имею в виду .... мой метод принимает входные данные Expression<Func<T, bool>> predicate, но new TableQuery<DynamicTableEntity>().Where принимает входные данные Expression<Func<DynamicTemplateEntity, bool>> predicate.

Есть идеи решить мою проблему?

Спасибо

...