linq-to-sql または nhibernate 実装間で交換できるように db レイヤーを設計する場合、インターフェイスに対してコーディングする必要があります。
これは、linq と nhibernate の両方の戻り値の型が同じ、つまり List などである必要があることを意味します。
リストの種類は同じですか?
linq-to-sql または nhibernate 実装間で交換できるように db レイヤーを設計する場合、インターフェイスに対してコーディングする必要があります。
これは、linq と nhibernate の両方の戻り値の型が同じ、つまり List などである必要があることを意味します。
リストの種類は同じですか?
たとえばリポジトリパターンを使用してデータベースアクセスをカプセル化する場合、リポジトリに共通のインターフェイスを実装させ、IEnumerable(T)やIList(T)などの戻り型として使用するために選択した型をメソッドに返すようにすることができます。
IList(T)はIEnumerable(T)を実装しているため、その方向に問題はありません。IEnumerable(T)がある場合は、IEnumerable(T)のToList()拡張メソッドを使用してList(T)を取得できます。IQueryable(T)はIEnumerable(T)をToList()に実装し、その場合も正常に機能します。
このようなもの:
public interface IFooRepository
{
IList<Foo> GetAll();
// ...
}
public class NHibernateFooRepository : IFooRepository
{
//...
public IList<Foo> GetAll()
{
return Session.CreateCriteria(typeof(Foo)).List<Foo>();
}
}
public class LinqToSqlFooRepository : IFooRepository
{
//...
public IList<Foo> GetAll()
{
var foos = from Foo f in context.Foos select f;
return foos.ToList();
}
}
IIRC、LINQクエリ内包表記なしで(リポジトリパターンを使用して)dbレイヤーを使用したくない場合は、LINQ to NHibernateをご覧ください。その場合、IQueryable<T>
ほとんどの場合、結果に対してコードを作成する必要があります。(ただし、すべてのプロバイダーで LINQ サポートが異なるため、事前にこれを実際にテストする必要があります。)
ただし、エンティティ型の 1-* リレーションは、既定ではおそらく同じ型を共有しません (通常EntitySet<T>
、LINQ- IList<T>
to-SQL と NHibernate にありますIList<T>
) 。IEnumerable<T>
そのような関係の場合、これも機能するはずです。
コンパイル時の互換性だけを考えている場合は、さまざまなコレクション型の違いは、一般的なものに固執する限り、それほど問題にはなりません。たとえば、NHibernate マッピングが を使用しIList<T>
、LINQ-to-SQL が を使用している場合EntitySet<T>
、メソッドに固執するだけIList<T>
で安全です。
各フレームワークの遅延読み込みと積極読み込みの違いに注意してください。
NHibernate はコレクションに対してデフォルトで IList を返しますが、残念ながら多くの linq 式はコレクションに対して機能しません。実際に調べていないので、NHibernate の戻り値の型を変更する方法があるかどうかはわかりません。