2009-08-22 3 views
1

。リポジトリ上のFindメソッドのメソッドシグネチャは次のとおりです。ジェネリックリポジトリLinq2Sqlのインピーダンスミスマッチ問題

T Find(Func<T, bool> query); 

私はLinq2Sqlでこれを使用しようとするまで、私は呼びたいときlinq2sqlは、独自のオブジェクトを作成し、その結果として、これはすべて素晴らしいです:

context.visitors.FirstOrDefault(query); 

linq2sqlが、それは私が渡しています機能を作成していない種類の機能を期待するので、型の不一致がある

答えて

1

まあはあなたがあなたのFind署名を変更する必要がありますで開始する:。

T Find(Expression<Func<T, bool>> query); 

LINQ to SQLは、ロジックをプレーンデリゲートの代わりに式ツリーとして持つ必要があります。それ以外の場合は、SQLに変換する方法を理解できません。

これ以外にも、それほど明確ではないことがわかります。リポジトリとLINQ to SQLで同じドメインクラスを使用していないようです。そうですか?それは潜在的な問題のように聞こえる。少なくともそれは人生をかなりトリッキーにするだろう。

+0

はい...ドメインオブジェクトにビヘイビアを追加したい場合や、メンバのアクセス可能性を制限したい場合があるため、Linq2SQLクラスをドメインオブジェクトとして使用したくありません。 –

+0

動作を追加するのは簡単です:生成されたクラスは*部分クラス*です。つまり、独自の動作を別のファイルに追加できますが、同じクラスに残ります。プロパティのアクセシビリティは、dbmlファイルで指定できます。 –

+0

これは証明ツリーをあるタイプから別のタイプへと変換するよりはるかに簡単なアプローチのように思えます。私はそのアプローチに進み、インターフェイスを介して可視性とアクセスを制限します。 –