Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MVC 3 LINQ使用用户指定的字段(属性)自定义排序和筛选_Sql Server_Linq_Asp.net Mvc 3_Sorting_Filtering - Fatal编程技术网

Sql server MVC 3 LINQ使用用户指定的字段(属性)自定义排序和筛选

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”开头的所有客户的列表,按城市、州和姓名排序。或者,他们可以返回名称以

我正在编写一个自定义web应用程序(一个管理实用程序),用于查询SQL Server数据库表,并让用户能够对返回的信息应用自己的(有限的)自定义排序和过滤器。发送页面允许他们使用HTML表单上的下拉列表选择最多3个排序标准(例如,排序1、排序2、排序3)。它们还必须指示字母表中的一个字母(通过URL),并且应用程序必须返回字段“Sort1”以字母开头的数据列表(过滤总是通过Sort1字段)

例如,他们可以选择返回城市以字母“R”开头的所有客户的列表,按城市、州和姓名排序。或者,他们可以返回名称以“F”开头的所有客户,按名称、地址和客户ID排序

我完全理解如何使用固定(已知)字段/属性执行此操作

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