2016-05-25 8 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です。上記で提供した述語は、以下の表現に変換されます。 、だから私は存在しないダウンGuid.Parse機能を渡している

を解析しません:

{p => (p.Id == Parse("07fafcd9-10db-e511-848d-005056b94716"))} 

上記述語はそのような機能は、次のメッセージ

で例外がスローされます私が次の述語を持っていれば同様の例外がスローされます。

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は、実際にSQLに変換されるか、ローカルで評価される基本的な.NET Framework機能を認識しないことが知られています。

私は

何も何が不足していないのです。 EFにパッチを当てるだけでなく、EFをサポートさせる方法もありません。また、自分のプロキシLINQプロバイダを作成することもできます。これは、1週間分の作業です。

あなたはこれで生きる必要があります。あなたはリポジトリなしで同じ問題を抱えています。 EFでこのようなLinqクエリを書くことはできません。

+0

データアクセスにローカルでhttps://github.com/oysteinkrog/SQLite.Net-PCLを使用しています。私はそれを使って生きる必要はないと思っていましたが、私は自分のプロキシLINQプロバイダーを作成する方法を研究するためにどこからリンクを張ることができますか? –

+0

Google for "LINQ provider" ...あなたはおそらくそのアプローチに納得しないでしょう。ロケット科学です。私はたくさんのことをする洗練されたものを書いたので分かります。なぜあなたはこのややエキゾチックなLinqプロバイダを使用していますか?私は主流のEFを最初に試してみよう。このようなニッチ・フレームワークをコア・インフラストラクチャーに使用することは、置き換えが難しいという疑問のある戦略です。 – usr

+0

私はEFを使用することはできません、クロスプラットフォームソリューションをサポートする必要があり、sqlite-net-pclは方法です。 –

関連する問題