2014-03-12 177 views
0

下面是有问题的代码。我在Linq查询中的where子句上收到Object reference not set to an instance of an object.。但是,这只发生在构建我的视图页面之后。使用linq和mvc过滤列表

含义:如果我逐步使用调试器,我可以看到它拉我正在筛选的正确顺序,转到正确的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); 
} 
+1

where!string.IsNullOrEmpty(n.OrderNumber)&& n.OrderNumber.ToUpper()。Contains(Request.QueryString [“FilterOrderNumber”]。ToUpper()。ToString()) –

回答

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

您的查询不被你的行动方法执行,因为你有没有一个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

0

你们都是对的。分开。

这个固定我的问题

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