Я создаю метод, принимающий на входе лямбда-выражение:
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
:
new TableQuery<DynamicTableEntity>().Where(string filter)
; 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
.
Есть идеи решить мою проблему?
Спасибо