2016-09-09 3 views
0

Я - greenhorn, когда дело доходит до LINQ. Я прочитал некоторые нулевые исключения, и большинство из них отметилLINQ - исключение null при получении определенного значения ячейки

... в sth.AsEnumerable() ...

как корень проблемы.

я столкнулся:

Оценка функции требует, чтобы все потоки для запуска.

Я попытался получить

FIELDNAME

из TrashPlaces (он имеет 2 поля только - идентификатор и имя) от строки Id я получаю от UserPlace записи (UserPlace имеет 2 ключа - 1 - это userId, который может быть получен из AspNetUsers, а другой - идентификатор TrashPlace). Я столкнулся с проблемой нуль на этом 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

Вы получаете коллекцию IQueryable при доступе к своим объектам контекста (например, «UserPlace», «TrashPlaces» и т. Д.). В наших запросах вы бросаете IQueryable (который представляет собой сборник не в памяти, а скорее преобразуется в SQL-запрос и обрабатывается СУБД), в IEnumerable, который загружает результаты каждого объекта в память (что означает, что вы их загрузили, и они находятся в контекст). Внешняя часть будет вести себя как LINQ-to-objects, а не LINQ-to-SQL. Сначала запустите его как IQueryable, а затем принесите результаты в память. Ниже приведен ответ, за которым следует следовать. – gdyrrahitis

ответ

2

Вы можете сделать все в одном (не перечисляйте на раннем этапе, это не хорошо для производительности).

Не знаете, почему вы используете ToString(), вам не нужно, если ваши идентификаторы одного типа.

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; 

Но тогда вам нужно проверить, TempData["fieldname"] не имеет значения null перед его использованием. ...

+0

это просто отлично, спасибо! –

Смежные вопросы