2012-12-03 12 views
5

動的ラムダ式を下の関数に渡したいのですが、式オブジェクトに対して.Take()または.OrderByDescending()を定義する方法がわかりません。 私は、以下の機能を呼び出したい場合は、私はこれを行うことができるようにしたい:ダイナミッククエリでLINQを使用してSELECT TOPを定義するにはどうすればよいですか?

dbprovider.Query = (x => x.ConfigurationReference == "172.16.59.175") 
        .Take(100) 
        .OrderByDescending(x.Date) 
FindEntities(db, dbprovider.Query) 

しかし、私はできません(この構文は無効です)。何か案は?

public static List<T> FindEntities<T>(TrackingDataContext dataContext, System.Linq.Expressions.Expression<Func<T, bool>> find) where T : class 
{ 
    try 
    { 
     var val = dataContext.GetTable<T>().Where(find).ToList<T>(); 
     return val; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 
+1

あなたの例外ハンドラがところで、有益な何も達成していない、といくつかの悪いことを(それはスタックトレースを失う)やるん。 'try' /' catch'を削除して、 'FindEntities'メソッド全体をかなり冗長に見せます –

答えて

5

パラメータは、タイプのものである:

System.Linq.Expressions.Expression<Func<T, bool>> find 

それは述語( "" 句)、およびのみ述語を取ることができることを意味します。

x => x.ConfigurationReference == "172.16.59.175" 

はそれがなるように、あなたは、FindEntitiesに残りのコードを追加する必要があり、あなたがやりたい:したがって、フィルタは、あなたが渡すことができる唯一のビットがあり

var val = dataContext.GetTable<T>().Where(find) 
       .OrderByDescending(x => x.Date).Take(100).ToList<T>(); 
あなたは はそれは次のようになりませんでした

一つの方法

Takeが本当にOrderByDescendingべきであることにも注意してください):

public static List<T> FindEntities<T>(TrackingDataContext dataContext, 
    System.Linq.Expressions.Expression<Func<T, bool>> find, 
    Func<IQueryable<T>, IQueryable<T>> additonalProcessing = null 
) where T : class 
{ 
    var query = dataContext.GetTable<T>().Where(find); 
    if(additonalProcessing != null) query = additonalProcessing(query); 
    return query.ToList<T>(); 
} 

およびコール:

var data = FindEntities(db, x => x.ConfigurationReference == "172.16.58.175", 
    q => q.OrderByDescending(x => x.Date).Take(100)); 

をしかし、率直に言って、私はこれのポイントはどうなるかわからない...呼び出し側がFindEntitiesを使用せずに、ローカルでより便利にそれをすべて自分で行うことができますまったく。ジャスト:

var data = db.GetTable<T>() 
      .Where(x => x.ConfigurationReference == "172.16.58.175") 
      .OrderByDescending(x => x.Date).Take(100).ToList(); 

かさえ:

var data = db.SomeTable 
      .Where(x => x.ConfigurationReference == "172.16.58.175") 
      .OrderByDescending(x => x.Date).Take(100).ToList(); 

か、単に:

var data = (from row in db.SomeTable 
      where row.ConfigurationReference == "172.16.58.175" 
      orderby row.Date descending 
      select row).Take(100).ToList(); 
関連する問題