Sql server MVC 3 LINQ使用用户指定的字段(属性)自定义排序和筛选
我正在编写一个自定义web应用程序(一个管理实用程序),用于查询SQL Server数据库表,并让用户能够对返回的信息应用自己的(有限的)自定义排序和过滤器。发送页面允许他们使用HTML表单上的下拉列表选择最多3个排序标准(例如,排序1、排序2、排序3)。它们还必须指示字母表中的一个字母(通过URL),并且应用程序必须返回字段“Sort1”以字母开头的数据列表(过滤总是通过Sort1字段) 例如,他们可以选择返回城市以字母“R”开头的所有客户的列表,按城市、州和姓名排序。或者,他们可以返回名称以“F”开头的所有客户,按名称、地址和客户ID排序 我完全理解如何使用固定(已知)字段/属性执行此操作Sql server MVC 3 LINQ使用用户指定的字段(属性)自定义排序和筛选,sql-server,linq,asp.net-mvc-3,sorting,filtering,Sql Server,Linq,Asp.net Mvc 3,Sorting,Filtering,我正在编写一个自定义web应用程序(一个管理实用程序),用于查询SQL Server数据库表,并让用户能够对返回的信息应用自己的(有限的)自定义排序和过滤器。发送页面允许他们使用HTML表单上的下拉列表选择最多3个排序标准(例如,排序1、排序2、排序3)。它们还必须指示字母表中的一个字母(通过URL),并且应用程序必须返回字段“Sort1”以字母开头的数据列表(过滤总是通过Sort1字段) 例如,他们可以选择返回城市以字母“R”开头的所有客户的列表,按城市、州和姓名排序。或者,他们可以返回名称以
var _data = _data.Where(d => d.Name.StartsWith(letter)).OrderBy(p => p.Name).ThenBy(p => p.Address).ThenBy(p => p.CustomerID);
等等,但在我的例子中,要排序/筛选的表属性(字段)并不明确知道;它们仅作为字符串对我的应用程序可用。我想做的是
var _data = _data.Where(d => d.["Sort1"].StartsWith(letter)).OrderBy(p => p.["Sort1"]).ThenBy(p => p.["Sort2"]).ThenBy(p => p.["Sort3"]);
其中Sort1、Sort2和Sort3是发布表单字段值,但我知道这不起作用。我如何实现这一点?我在C#中使用ASP.Net MVC 3,LINQ使用实体框架(EDM)。您应该使查询成为动态查询,在进行动态查询时,您应该使用SQL上的(Exec)命令来执行动态查询 就是这样:D
但您应该注意到,execute命令对于性能问题不是很好。这种方法如何:
Func<Record, object> sort1 = r => GetProperty(r, "City");
Func<Record, object> sort2 = r => GetProperty(r, "State");
Func<Record, object> sort3 = r => GetProperty(r, "Address");
Func<Record, bool> filterPredicate = p => GetProperty(p, "City").ToString().StartsWith("A");
IEnumerable<Record> enumerable = list.Where(filterPredicate)
.OrderBy(sort1)
.ThenBy(sort2).
.ThenBy(sort3);
我不得不说,经过一些调整(例如,MVC似乎不支持对lambda函数变量使用“var”),这是非常有效的。谢谢你的帮助^=很抱歉我取出了类型声明,这样就不需要水平滚动,也没有检查它是否无效。我将为未来的访客恢复它。很高兴你成功了。
static object GetProperty(Record record, string paramName)
{
if (paramName == "City") return record.City;
if (paramName == "State") return record.State;
if (paramName == "Address") return record.Address;
if (paramName == "CustomerId") return record.CustomerId;
throw new InvalidEnumArgumentException();
}