2017-03-20 9 views
1

は、LINQのコードを考えてみましょう:パラメータとして渡された列名でLINQグループ - LINQ TO SQL

var objs = (ClientsDB.Context.ClientProcessed.GroupBy(grp => new 
      { 
       City = grp.City, 
       Day = grp.Insert_Date.Value.Day, 
       Month = grp.Insert_Date.Value.Month, 
       Year = grp.Insert_Date.Value.Year 
      }).... 



var objs = (ClientsDB.Context.ClientProcessed.GroupBy(grp => new 
     { 
      Department = grp.Department, 
      Day = grp.Insert_Date.Value.Day, 
      Month = grp.Insert_Date.Value.Month, 
      Year = grp.Insert_Date.Value.Year 
     }).... 


var objs = (ClientsDB.Context.ClientProcessed.GroupBy(grp => new 
{ 
    State = grp.State, 
    Day = grp.Insert_Date.Value.Day, 
    Month = grp.Insert_Date.Value.Month, 
    Year = grp.Insert_Date.Value.Year 
}).... 

どのように私は、文字列として渡された特定の列でGROUPBYを行っていることができますか?例えば

String grpByParam = "City"; // grpByParam = "State"; // String grpByParam = "Department"; 

そして、LINQクエリにそのPARAMを渡し、代わりにLINQを複製するのは、すべての今、もう一度照会します。

FYI、LINQ-TO-OBJECTSクエリではなく、メモリではなくDBでフィルタリングを行う必要があることを意味します。

これは可能ですか?

おかげ

+0

この例では、4つの列でグループ分けしています。条件によってそのグループを表す文字列は何でしょうか? – Evk

+0

@Evk:String grpByParam = "City"; // grpByParam = "状態"; // grpByParam = "Department"; – ron

+0

私はそれが可能だと信じていますが、それはそれがそれに値するとは思っていません。あなたは匿名型のダイナミクスのインスタンスを作成する匿名型と式を生成できますが、プレーンなC#コードでは使用できません.Funcを生成する必要があります.Funcはその動的表現でGroupByを呼び出します。ここに私がインターネットhttps://gist.github.com/dcastro/9093000で見つけたタイプと表現の生成のサンプルがあります。可能なクエリごとに型を作成すると、それほどクールではありません。 – Atomosk

答えて

0

あなたは文字列の値をチェックして、あなたは(GroupByせずにLINQクエリ)sourceを受け取るメソッドを実装することが可能に

if (grpByParam.Equals("City")) { 
    result = source.GroupBy(a => a.City); 
} ... 

に基づいてGroupByを呼び出すことができますし、returnresultGroupByの結果)

このメソッドは、遅延実行を使用して実装されます。即時の 戻り値は、アクションを実行するために必要なすべての情報( )を格納するオブジェクトです。このメソッドによって表されるクエリ は、 GetEnumeratorメソッドを直接呼び出すか、Visual C#でforeachを使用するか、Visual Basicで を使用して、オブジェクトが列挙されるまで実行されません。

docsである。