我确定这不是最有效的方法,但我有一个LINQ语句,并希望OrderBy基于一个切换案例的字段(这是在GridView的OnSorting事件中)
CFRelease
我的猜测是我无法在查询中放置字符串文字。我应该更改我的排序表达式以匹配我想要OrderBy的字段,或者是否有办法在查询中放置一个参数并接受它(我不能按日期排序我需要按btu.Date排序)
答案 0 :(得分:1)
尝试代码:
你直接无法在btu中使用Linq Object 所以我已经改变了解决这个问题的方法。
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 studio->工具 - > 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();
答案 1 :(得分: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。