2016-05-25 6 views
2

У меня есть следующий вызов в моей модели 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 для доступа к данным.

Что мне не хватает, чтобы предикат правильно скомпилировал мой метод репозитория?

ответ

2

Поставщики Linq отличаются тем, какие шаблоны они поддерживают. Ваш не распознает Guid.Parse. Это EF? Известно, что EF не распознает множество базовых функциональных возможностей платформы .NET Framework, которые фактически могут быть переведены на SQL или оценены локально.

, что не я пропускаю

Ничего. Невозможно включить поддержку EF, кроме исправления EF или создания собственного провайдера LINQ-провайдера, который работает на неделю.

Вам нужно жить с этим. У вас будет такая же проблема без репозитория. Вы просто не можете писать такие запросы Linq с EF.

+0

Я использую https://github.com/oysteinkrog/SQLite.Net-PCL для доступа к данным на локальном компьютере. Я надеялся, что мне не нужно жить с ним, какие-либо ссылки, где я могу начать изучать, как исправить это, написать собственный провайдер LINQ-провайдера? –

+0

Google для «провайдера LINQ» ... Вероятно, вы не согласитесь на этот подход. Это ракетная наука. Я знаю, потому что я написал сложную вещь, которая многое делает. Почему вы используете этот довольно экзотический поставщик Linq? Сначала я попробую использовать EF. Использование таких нишевых структур для базовой инфраструктуры, которую трудно заменить, является сомнительной стратегией. – usr

+0

Я не могу использовать EF, нужно поддерживать кросс-платформенное решение, и sqlite-net-pcl - это путь. –