2016-09-09 19 views
0

當談到LINQ時,我是一個新手。我讀過一些空例外,其中大部分人士指出LINQ - 獲得特定單元格值時的空例外

...在sth.AsEnumerable()...

因爲問題的根源。

我碰到:

功能評價要求所有線程運行。

我試圖找回

字段名

從TrashPlaces(它有2場只有 - ID和名稱)的字符串ID,我從UserPlace記錄得到(UserPlace有2把鑰匙 - 1是userId,可以從AspNetUsers中檢索,另一個是TrashPlace id)。我已經在這個LINQ代碼運行到零問題:

 public ActionResult JsonResult() 
     { 
      var users = db.AspNetUsers; 

      //this was added, so I could root out mismatch in the queryId 
      var nameformyuser = User.Identity.Name; 



//the null starts here and no-shock it goes further (meaning query is null and 
//can't do nothing later) 

      var queryId = from user in users.AsEnumerable() 
         where user.Email == User.Identity.Name 
         select user.Id; 


      var placerecord = db.UserPlace; 


      var userplace = from uplace in placerecord.AsEnumerable() 
         where uplace.usersId == queryId.ToString() 
          select uplace.placesId; 

      var places = db.TrashPlaces; 

      var field = from blah in places.AsEnumerable() 
         where blah.Id == userplace.ToString() 
         select blah.nameOfThePlace; 






      TempData["username"] = User.Identity.Name; 
      TempData["fieldname"] = field.ToString(); 
      TempData["datename"] = DateTime.Now; 


      List<TrashViewModel> json = (List<TrashViewModel>)TempData["jsonList"]; 


      return View(json); 
    } 

將是幫助和/或建議什麼是對級聯LINQ最好的辦法感謝。

謝謝!

+2

當你訪問你的上下文實體(比如'UserPlace','TrashPlaces'等等)時,你會得到一個IQueryable集合。在我們的查詢中,您將IQueryable(這是一個不在內存中的集合,而是轉換爲SQL查詢並由DBMS處理)轉換爲IEnumerable,它將每個實體的結果加載到內存中(這意味着您獲取了它們並且它們在上下文)。外部部分將在LINQ-to-objects而不是LINQ-to-SQL上運行。首先將它作爲IQueryable運行,然後將結果存入內存。下面的答案是你應該遵循的。 – gdyrrahitis

回答

2

你可以做到一切(不要一一列舉,這對性能不利)。

不確定爲什麼你使用ToString()如果你的ID是同一類型的話,你不應該這麼做。

var query = from u in db.AspNetUsers 
      join up in db.db.UserPlace on u.Id equals up.usersId 
      join tp in db.TrashPlaces on up.placesId equals tp.Id 
      where u.Email == User.Identity.Name 
      select tp.nameOfThePlace;//or more data if you need to. 

var result = query.FirstOrDefault(); //or query.AsEnumerable() 

然後,你可以做一個空檢查

if (result == null) 

在你的情況下,TempData的,你可能只是做

TempData["fieldname"] = result == null ? string.Empty : result; 

TempData["fieldname"] = result; 

但你必須檢查在使用它之前,不爲空。 ...

+0

這只是完美的,謝謝! –

相關問題