为什么这个Linq Where Clause没有过滤结果

时间:2014-05-21 15:20:29

标签: c# asp.net-mvc linq

我是Linq和MVC的新手,并且已经进行了大量的搜索和学习以达到这一点。

我有以下方法成功接收参数" code"。

    public ActionResult GetIssueList(string code)
    {
        //dynamic fill of project code dropdown on selection of customer code drop down
        ProjectManager pm = new ProjectManager();

        var projectcodes = pm.SelectAllProjects();
        var projects = new List<Project>();

        foreach (var proj in projectcodes)
        {
            projects.Add(proj as Project);
        }
        return Json(projects.Where(x => x.CustomerCode == code).ToList());
    }

正在从数据库中检索数据,但where子句不会过滤掉等于参数的数据。

2 个答案:

答案 0 :(得分:1)

通过执行进行调试,并确保这些项目当前没有CustomerCode code。我的问题是#34;是项目代码Project对象中的项目吗?如果不是,则不能as cast他们Project,而是必须new Projects使用该代码new Project(projectCode)

此外,您上面写的所有内容都可以轻松地重写为一行代码。 (您可能需要在.ToList<Project>()之前执行Where,但我不知道您的类型,所以我不会假设)

public ActionResult GetIssueList(string code)
{
    return Json(new ProjectManager()
        .SelectAllProjects()
        .Select(proj => proj as Project)
        .Where(proj => proj.CustomerCode == code)
        .ToList();
}

编辑:在return语句的上面方法中放置一个断点,如果列表中的项目具有预期的CustomerCode,则在比较发生之前进行检查。

答案 1 :(得分:0)

这里有太多未知数要更准确地回答,但为了更容易逐步调试,我建议你将Where调用更改为传统循环(并在发现问题后将其更改回来当然):

public ActionResult GetIssueList(string code)
{
    IEnumerable<Project> projects =
        new ProjectManager()
        .SelectAllProjects()
        .Cast<Project>();

    //this is replacement for Where call.
    //Debug breakpoint here step by step and look at the CustomerCode values
    //to find out why they are all added.
    List<Project> filtered = new List<Project>();
    foreach(Project p in projects)
    {
        if(p.CustomerCode == code)
            filtered.Add(p);
    }

    return Json(filtered);
}