下面是有问题的代码。我在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);