以下是相关代码。我在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);
}
答案 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);