9

linq クエリの一部を関数に渡すことは可能ですか? 常に同じクエリ インターフェイスを使用する DAL 用の共通インターフェイスを作成したいと考えています。例えば、

List<T> Get(Join j, Where w, Select s){    
    return currentDataContext<T>.Join(j).Where(w).Select(s).ToList();    
}

このようなことは可能ですか?式ツリーで行うと考えていますが、その例を見つけることができませんでした。

4

5 に答える 5

2

このジェネリック クラスを確認してください: TableView.cs

基本的に Func<TEntity, bool> デリゲートを使用して Where 述語を適用します。

//...
public TableView(DataContext dataContext, Expression<Func<TEntity, bool>> predicate)
{
    this.table = dataContext.GetTable<TEntity>();
    this.baseQuery = table.Where(predicate);
    this.predicate = predicate.Compile();
}
//...
于 2009-01-12T05:25:08.090 に答える
1

Linq Examples で利用可能な Dynamic Expression ライブラリを使用できます。この拡張ライブラリを使用すると、where などの linq 句を渡すことができます...

ここから入手できるダウンロード linq サンプル

于 2009-01-12T09:50:47.147 に答える
0

Dynamic LINQを使用して、パラメーターを文字列として渡すことができます。

于 2009-01-12T05:22:24.647 に答える
0

いつものように、Marc Gravell♦ は非常に洞察に満ちた回答を提供してくれましたが、IQueryablesを使用して制限を追加するメソッドを使用すると、ほとんどの場合に機能し、コードがより明確になり、保守が容易になると思います。例えば:

//Join
public static IQueryable<IContract> AllContracts(this IQueryable<IAccount> accounts, ISession s ) {
          return from a in accounts
                 from contract in s.Query<IContract()
                 where (a.Id == contract.AccountId)
                 select contract;
    }
//Where
public static IQueryable<IContract> Active(this IQueryable<IContract> contracts) {
          return from contract in contracts
                 where (contract.Active == true)
                 select contract;
    }

次に、これらを次のように組み合わせて一致させることができます。

IQueryable<IContract> activeContracts = s.Query<IAccount>()
            .Where(o => o.Name == "XXX")
            .GetContracts(s)
            .Active();

ここでは拡張メソッドと NHiberante の LINQ 提供のQueryメソッドを使用していますが、これは静的メソッドや LINQ プロバイダーを使用せずに簡単に書き直すことができます。

于 2012-07-04T03:03:51.700 に答える