2014-03-12 120 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);