関数 - linq where 複数 条件




IQueryable<T>を使用したデザインパターン (2)

リポジトリパターンを実装するのがはるかに簡単になりました。 基本的にリポジトリを作成することができます:

public class LinqToSqlRepository : IRepository
{
   private readonly DataContext _context;

   public LinqToSqlRepository(DataContext context)
   {
       _context = context;
   }

   public IQueryable<T> Find<T>()
   {
       return _dataContext.GetTable<T>(); // linq 2 sql
   }

   /** snip: Insert, Update etc.. **/
}

linqでそれを使用してください:

var query = from customers in _repository.Find<Customer>() 
            select customers;

https://code.i-harness.com

.NET 3.5とIQueryable<T>インターフェイスの導入により、新しいパターンが登場します。 私は仕様パターンのいくつかの実装を見てきましたが、私はこの技術を使用して他の多くのパターンを見ていません。 Rob ConeryのStorefrontアプリケーションは、 IQueryable<T>を使用した別の具体的な例であり、いくつかの新しいパターンにつながる可能性があります。

どのようなパターンが有用なIQueryable<T>インターフェースから浮かび上がってきましたか?


私はリポジトリフィルタパターンが好きです。 パフォーマンスを犠牲にすることなく、中間およびデータ・エンド層から懸念事項を分離することができます。

中間層はIQueryableへの拡張を利用してより堅牢な機能を提供することができますが、データレイヤーは単純なリスト取得スタイルの操作に集中できます。

リポジトリ(データ層):

public class ThingRepository : IThingRepository
{
    public IQueryable<Thing> GetThings()
    {
        return from m in context.Things
               select m; // Really simple!
    }
}

フィルタ(サービス層):

public static class ServiceExtensions
{
    public static IQueryable<Thing> ForUserID(this IQueryable<Thing> qry, int userID)
    {
        return from a in qry
               where a.UserID == userID
               select a;
    }
}

サービス:

public GetThingsForUserID(int userID)
{
    return repository.GetThings().ForUserID(userID);
}

これは簡単な例ですが、フィルタを組み合わせてより複雑なクエリを作成することもできます。 すべてのフィルタがクエリに組み込まれるまでリストがマテリアライズされないため、パフォーマンスが低下します。

私はアプリケーション固有のリポジ​​トリが嫌いなので好きです!





iqueryable