C# 表中数据的排序和搜索不起作用

C# 表中数据的排序和搜索不起作用,c#,linq,asp.net-mvc-4,sorting,search,C#,Linq,Asp.net Mvc 4,Sorting,Search,我遵循以下有关排序和搜索的教程: 当我尝试这样做时,排序不起作用。我想对3个字段进行排序,用户名、用户角色和注册日期。我显示的数据没有按任何顺序排序,只是显示数据。 谁能帮我一下我做错了什么 //controller code: public ActionResult DisplayUsers(string sortOrder, string searchString) { ViewBag.NameSortParm1 = String.IsNull

我遵循以下有关排序和搜索的教程:

当我尝试这样做时,排序不起作用。我想对3个字段进行排序,用户名、用户角色和注册日期。我显示的数据没有按任何顺序排序,只是显示数据。 谁能帮我一下我做错了什么

//controller code:
    public ActionResult DisplayUsers(string sortOrder, string searchString)
        {
            ViewBag.NameSortParm1 = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewBag.NameSortParm2 = String.IsNullOrEmpty(sortOrder) ? "role_desc" : "";
            ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

            var users = from a in db.app_user
                            select a;
          
            switch (sortOrder)
            {
                case "name_desc":
                    users = users.OrderByDescending(a => a.username);
                    break;
                case "role_desc":
                    users = users.OrderBy(a => a.user_role);
                    break;
                case "date_desc":
                    users = users.OrderBy(a => a.date_of_register);
                    break;
                default:
                    users = users.OrderBy(a => a.username);
                    break;
            }

            return View(db.app_user.ToList());
        } 
查看页面

//DisplayUsers.cshtml page
    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.ActionLink("User Name", "DisplayUsers", new { sortOrder = ViewBag.NameSortParm1 })
                </th>
                <th>
                    @Html.ActionLink("User Role", "DisplayUsers", new { sortOrder = ViewBag.NameSortParm2 })
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.is_active)                
                </th>
                <th>
                    @Html.ActionLink("Enrollment Date", "DisplayUsers", new { sortOrder = ViewBag.DateSortParm })
                </th>
                <th></th>
            </tr>
        </thead>
    
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.username)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.user_role)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.is_active)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.date_of_register)
                </td>            
            </tr>
        }
    </table>
获取错误:

错误1实例参数:无法从“System.DateTime?”转换为 “System.Linq.IQueryable”

错误2“System.DateTime?”不包含的定义 “Contains”和最佳扩展方法重载 'System.Linq.Queryable.ContainessSystem.Linq.IQueryable, TSource'有一些无效参数

如何在日期字段上进行搜索?
请帮助我,我们将非常感谢您提供的任何帮助。

您没有返回用户变量。在下面修好了

public ActionResult DisplayUsers(string sortOrder, string searchString)
{
    ViewBag.NameSortParm1 = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
    ViewBag.NameSortParm2 = String.IsNullOrEmpty(sortOrder) ? "role_desc" : "";
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

    var users = from a in db.app_user
                select a;

    switch (sortOrder)
    {
        case "name_desc":
            users = users.OrderByDescending(a => a.username);
            break;
        case "role_desc":
            users = users.OrderBy(a => a.user_role);
            break;
        case "date_desc":
            users = users.OrderBy(a => a.date_of_register);
            break;
        default:
            users = users.OrderBy(a => a.username);
            break;
    }

    return this.View(users.ToList());
    // return View(db.app_user.ToList());
} 
至于你问题的第二部分

寄存器的date\u的类型为DateTime?,可为空的DateTime类型不包含名为Contains的方法,如果它。。。如果要检查字符串是否为DateTime类型,可以尝试使用以下代码对其进行解析

if (!String.IsNullOrWhiteSpace(searchString))
{
    DateTime dateOfRegistration;

    bool isDateTime = DateTime.TryParse(searchString, out dateOfRegistration);
    if (isDateTime)
    {   
        users = users.Where(user => user.date_of_register == dateOfRegistration);
    }
    else 
    {
        users = users.Where(a => a.username.Contains(searchString));
    }
}
分类:

问题是您使用的是预取列表,但您没有将其发送到视图

return View(db.app_user.ToList()); 
应该是

return View(user.ToList());
搜索:

您再次使用Contains,它期望对象是可查询的,而datetime不是,因此您需要为datetime筛选器编写一个特例:

DateTime datetime = Convert.ToDateTime(searchString);
if (datetime.TimeOfDay != TimeSpan.Zero) //comparison with 00:00:00 time
{
    filterresults = filterresults.Where(x => x.TimeStarted == datetime);
}
else
{
    DateTime plusOneDateTime = datetime.AddDays(1).Date;
    filterresults = filterresults.Where(x => x.TimeStarted >= datetime.Date 
                                           && x.TimeStarted < plusOneDateTime);
}

我认为您应该返回users.ToList,而不是返回原始无序集合:return Viewdb.app_user.ToList;这就是你们得到无序数据的原因。谢谢你们。我可以对用户名和用户角色进行排序。但无法在注册日期排序。为什么会这样?因为Contains是一种可以应用于字符串对象的方法,但在您的情况下,注册日期是DateTime类型,所以您需要使用>=对其进行比较,因为存在相同的问题。我无法对字段用户角色和注册日期进行排序。为什么?请您指导我。在else block users=users.where=>a.username.ContainssearchString | | a.date_of_register==searchString;}运算符==不能应用于“System.DateTime”和“string”类型的操作数
DateTime datetime = Convert.ToDateTime(searchString);
if (datetime.TimeOfDay != TimeSpan.Zero) //comparison with 00:00:00 time
{
    filterresults = filterresults.Where(x => x.TimeStarted == datetime);
}
else
{
    DateTime plusOneDateTime = datetime.AddDays(1).Date;
    filterresults = filterresults.Where(x => x.TimeStarted >= datetime.Date 
                                           && x.TimeStarted < plusOneDateTime);
}