2016-09-09 2 views
0

LINQ와 관련하여 저는 미남입니다. 좀 널 (null) 예외를 읽은 그들 중 대부분은 문제의 루트로 ... sth.AsEnumerable()에서 ... LINQ - 특정 셀 값을 가져 오는 데 null 예외가 발생했습니다.

을 지적했다.

내가으로 실행했습니다 :

기능 평가를 실행하는 모든 스레드가 필요합니다.

나는 TrashPlaces에서

필드 이름

를 검색하려고합니다 (2 개 필드 만이 - ID와 이름) 내가 UserPlace 기록에서 얻을 문자열 ID로를 (UserPlace 2 키가 - 1은 AspNetUsers에서 검색 할 수있는 userId이고 다른 하나는 TrashPlace ID입니다. 나는이 LINQ 코드에 널 (null) 문제로 실행했습니다

 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로 캐스팅합니다. IEnumerable은 메모리의 각 엔터티 결과를로드합니다. 문맥). 외부 부분은 LINQ-to-SQL보다는 LINQ-to-Object에서 작동합니다. 먼저 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() 

은 그럼 당신은 TempData를 들어, 당신은 그냥 할 수 있습니다, 귀하의 경우에는 널 체크

if (result == null) 

을 할 수

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

또는

TempData["fieldname"] = result; 

그런데 당신을을 확인해야 할 것입니다.은 사용하기 전에 null이 아닙니다. ...

+0

이것은 완벽합니다. 감사합니다! –

관련 문제