2017-06-20 7 views
0

これは最も効率的な方法ではないと確信していますが、LINQステートメントを持ち、スイッチケースに基づくフィールドをOrderByにしたい(これはGridViewのOnS​​ortingイベントにあります)LINQ OrderBy文字列パラメーター

switch (e.SortExpression) 
{ 
    case "Date": 
    field = "btu.Date"; 
    break; 
} 

var ds (from btu in dc.BTUs 
     join zone in dc.BTUZones on btu.BTUZoneKey equals zone.BTUZoneKey 
     orderby field ascending 
     select new { btu.BTUKey, btu.Date, zone.BTUZoneName, btu.BTUValue }).ToList(); 
gv.DataSource = ds; 
gv.DataBind(); 

私の推測では、クエリに文字列リテラルを置くことはできません。 OrderByを使用したいフィールドに合わせてソート式を変更するか、クエリにパラメータを配置する方法がありますか(受注できない日は注文できません)

答えて

1

のtryコード:BTU で

あなたが直接使用することができませんでしたしているLINQのオブジェクトは、だから私は、ALTER解決策この問題を抱えています。

var ds = (from btu in dc.BTUs 
    join zone in dc.BTUZones on btu.BTUZoneKey equals zone.BTUZoneKey 
    select new { btu.BTUKey, btu.Date, zone.BTUZoneName, btu.BTUValue }).ToList(); 


    switch (e.SortExpression) 
    { 
     case : "Date": 
     ds= ds.OrderBy(c=>c.Date).ToList(); 
     break; 
     case : "Name" 
     ds= ds.OrderBy(c=>c.BTUZoneName).ToList(); 
     break; 
    } 

と別のソリューションを追加:studio->ツール - > NewGetパッケージマネージャ - 対にLINQのSystem.Linq.Dynamic

Go]を使用して

を>パッケージマネージャコンソール

のコマンドを入力します。

Install-Packageをインストールする.Linq.Dynamic -Version 1.0.7

この参照コードの下に使用した後、あなたのプロジェクト

を追加します。

using System.Linq.Dynamic; 


string Field=""; 
switch (e.SortExpression) 
{ 
    case : "Date": 
    Field= "Date"; 
    break; 
    case : "Name" 
    Field= "BTUZoneName"; 
    break; 
} 

var ds = (from btu in dc.BTUs 
    join zone in dc.BTUZones on btu.BTUZoneKey equals zone.BTUZoneKey 
    select new { btu.BTUKey, btu.Date, zone.BTUZoneName, btu.BTUValue }) 
    .OrderBy(Field).ToList(); 
+0

が魅力のように働きました!私はちょうど(フィールド+ "昇順")も持っていなければなりませんでした。私は必要なものを正確に得ました。ありがとう! – toadfromgrove

0

おそらく、LINQに任意のランタイムデータをソートさせる最も簡単な方法は、System.Linq.Dynamic NuGet packageをインストールすることです。 (ここlibrary's dynamic operatorsに関するドキュメントへのリンクです)

しかし、あなたはメソッドの構文にクエリ構文から、あなたのLINQを変更する必要があります:

using System.Linq.Dynamic; 

... 

var ds = 
    dc.BTUs 
    .Join(dc.BTUZones, 
     btu => btu.BTUZoneKey, 
     zone => zone.BTUZoneKey, 
     (btu, zone) => new { btu.BTUKey, btu.Date, zone.BTUZoneName, btu.BTUValue }) 
    .OrderBy("BTUZoneName") // Or you can use a string variable 
          // or function call for the parameter. 
    .ToList(); 

ダイナミックランタイムLINQクエリを構築する別の方法は、作成することです。独自のカスタム表現ツリー。これはSystem.Linq.Dynamicのコードがどのように実装されているかを示しています。これはMicrosoft article that explains the basicsです。

関連する問題