У меня есть следующий вызов в моей модели ViewModel.Выражения, переданные методу репозитория, неправильно скомпилированы
Order order= await DataService.Orders.GetAsync(p => p.Id == Guid.Parse("07fafcd9-10db-e511-848d-005056b94716"));
Репозиторий «Заказы» имеет следующий метод.
public async Task<T> GetAsync(Expression<Func<T, bool>> predicate)
{
return await Db.FindAsync<T>(predicate).ConfigureAwait(false);
}
Db
свойство типа SQLiteAsyncConnection
. Предикат I, указанный выше, переведёт в нижеследующее представление.
{p => (p.Id == Parse("07fafcd9-10db-e511-848d-005056b94716"))}
выше предикат будет сгенерировано исключение со следующим сообщением
нет такой функции: не разобрать
Так я пропусканием Guid.Parse
функцию вниз, не существует, Подобное исключение будет выбрано, если у меня будет следующий предикат.
Order order= await DataService.Orders.GetAsync(p => p.Id == anotherInstanceObject.Id);
Решение заключается в замене моего кода на передачу фактического значения.
Guid guid = Guid.Parse("07fafcd9-10db-e511-848d-005056b94716");
Order order= await DataService.Orders.GetAsync(p => p.Id == guid);
Но выше настолько противоречит интуитивным и представит много проблем, когда разработчики начнут используя DataService
класс.
Я использую SQLite.Net-PCL для доступа к данным.
Что мне не хватает, чтобы предикат правильно скомпилировал мой метод репозитория?
Я использую https://github.com/oysteinkrog/SQLite.Net-PCL для доступа к данным на локальном компьютере. Я надеялся, что мне не нужно жить с ним, какие-либо ссылки, где я могу начать изучать, как исправить это, написать собственный провайдер LINQ-провайдера? –
Google для «провайдера LINQ» ... Вероятно, вы не согласитесь на этот подход. Это ракетная наука. Я знаю, потому что я написал сложную вещь, которая многое делает. Почему вы используете этот довольно экзотический поставщик Linq? Сначала я попробую использовать EF. Использование таких нишевых структур для базовой инфраструктуры, которую трудно заменить, является сомнительной стратегией. – usr
Я не могу использовать EF, нужно поддерживать кросс-платформенное решение, и sqlite-net-pcl - это путь. –