2017-06-20 90 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