使用linq和mvc过滤列表

时间:2014-03-12 21:19:04

标签: asp.net-mvc linq filtering

以下是相关代码。我在Linq查询中的Object reference not set to an instance of an object.子句上收到where。但是,这只会在它通过并构建我的viewpage之后发生。

含义:如果我逐步使用调试器,我可以看到它拉出我正在过滤的正确顺序,转到正确的ViewPage,用正确的过滤项填写模型/表,然后它回到我的控制器并向我显示错误。

public ActionResult OrderIndex(string searchBy, string search)
{
    var orders = repositoryOrder.GetOpenOrderList();

    if (Request.QueryString["FilterOrderNumber"] != null)
    {
        var ordersFiltered = from n in orders
            where n.OrderNumber.ToUpper().Contains(Request.QueryString["FilterOrderNumber"].ToUpper().ToString())
            select n;
        return View(ordersFiltered);
    }

    return View(orders);
}

3 个答案:

答案 0 :(得分:2)

总是更好地操纵你的字符串和linq查询之外的其他东西,

请参阅:http://msdn.microsoft.com/en-us/library/bb738550.aspx

可读性的角度来看也不好,

public ActionResult OrderIndex(string searchBy, string search)
{
    var orders = repositoryOrder.GetOpenOrderList();
    var orderNumber = Request.QueryString["FilterOrderNumber"];
    if (!string.IsNullOrEmpty(orderNumber))
    {
        orderNumber = orderNumber.ToUpper();
        var ordersFiltered = from n in orders
            where n.OrderNumber.ToUpper().Contains(orderNumber)
            select n;
        return View(ordersFiltered);
    }

    return View(orders);
}

答案 1 :(得分:1)

您的查询未在Action方法中执行,因为您没有在查询中添加ToList(或等效项)。当您的代码返回时,您的查询将在视图中的某处枚举,这就是发生错误的位置。

尝试将ToList添加到您的查询中,以强制在您的操作方法中执行查询:

var ordersFiltered = (from n in orders
                     where n.OrderNumber.ToUpper().Contains(Request.QueryString["FilterOrderNumber"].ToUpper().ToString())
                     select n).ToList();

出现问题的是,where条款的一部分是null。这可能是您的查询字符串参数。尝试将Request.QueryString部分移出查询并转换为临时变量。如果不是这样,请确保您的订单有OrderNumber

答案 2 :(得分:0)

你们两个都是对的。只是单独。

这解决了我的问题

var ordersFiltered = (from n in orders
                      where !string.IsNullOrEmpty(n.OrderNumber) && n.OrderNumber.ToUpper().Contains(Request.QueryString["FilterOrderNumber"].ToUpper().ToString())
                      select n);