2017-06-20 124 views
0

我敢肯定,這不是最有效的方法,但我有一個LINQ語句,並希望OrderBy基於開關情況下的字段(這是在GridView的OnSorting事件中)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的字段,或者是否有方法在查詢中放置參數並接受它(我無法按日期排序,因此我需要通過btu.Date訂購)

回答

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; 
    } 

,並添加另一種解決方案:

使用LINQ System.Linq.Dynamic

轉到Vs的工作室 - >工具 - > NewGet軟件包管理器 - >軟件包管理器控制檯

進入命令

安裝Install-Package System.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