2011-06-29 5 views
1

私はいくつかのデータソースからビジネス情報を提供するWCFプロジェクトに取り組んでいます。データソースは、それが動作しますが、SQL Serverデータベースである場合にはLINQ式または仕様パターンを使用してIngresデータベースにアクセスしますか?

repo.Find(b => b.Name.Contains("abc")); 

public interface IRepository<T> { 
    IQueryable<T> Find(Expression<Func<T, bool>> criteria); 
} 

、サービスとしてのリポジトリを介してデータソースを照会:コードを再利用するには、私のBusinessContactServiceはとして定義されている一般的なリポジトリの依存性が含まれていますEntity Frameworkを介してしかし、Ingresデータベースでサービスを実行すると、.NETデータプロバイダまたはODBCドライバがLINQ式で動作しないため、問題が発生します。以下、私が見つけたいくつかの回避策があります:EF用

  1. Virtuoso data provider:それは無料ではありませんし、システムチームはとにかくそれをインストールするように感じていないので、私はそれを使用することはできません。
  2. Ingres EFプロバイダをEntity Framework sample providerとしてカスタマイズします。非常に興味深いですが、私はタイムラインを作るのを恐れています(来週までに)
  3. 仕様パターンを使用して私のサービスでLINQ式の使用を非表示にしています。したがって、SQL Serverの仕様実装ではLINQを使用し、Ingresの場合はado.netを使用します。
  4. NHibernate.Linq。私はNHibernateで少し知っているが、someone here said it works fine with ODBCと私はIngresとLINQの表現を橋渡しすることができるかもしれないと思う。

オプション2〜4についてご提案ください。多くのありがとうございます!

答えて

1

まずは少しお勧めします。あなたの一般的なinterfeceのために、私はそれを公開する方が良いだろうと思う:

IQueryable<T> Query<T>(); 

だから、アプリケーション層は次のように、それが望んでいるものは何でもそれとチェーンを呼び出すことができます:あなたの質問のために

var temp = repo.Query<User>().Where(c => c.Email.Contains("@foo.com")).OrderBy(c => c.FirstName); 

、私は、EFプロバイダーがいない場合、または何らかの理由でそれを使用できない場合、Fluent Nhibernateを使用したNHibernateは非常に選択肢であることを発見しました。 EFほど強力ではありませんが(コードは最初、明らかに)、まだまだ良いフォールバックです。それは最も一般的なlinq演算子をサポートし、あなたの抽象的な設計に完全に合うでしょう。

+0

ありがとう、Matteo。私はクエリ()メソッドが好きです。クラスの代わりにジェネリックメソッド、そうではありませんか?そして私はNHibernateを試みます。 – tang

+0

はい。リポジトリインタフェースは汎用的ではありません。 1つのクラスに実装してから、クエリを使用すると、すべてのタイプにアクセスできます。 –

関連する問題