使用linq和mvc过滤列表



下面是有问题的代码。我在Linq查询中的where子句上接收Object reference not set to an instance of an object.。然而,这只发生在它通过并构建我的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);
}

最好在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);
}

您的查询没有在您的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

你们都是对的。只是分开。

这个修复了我的问题

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

相关内容

  • 没有找到相关文章

最新更新