2015-04-28 4 views
2

У меня есть код, который выбирает некоторые значения из моей базы данных. У меня есть IQueryable запросов, что содержит ICollection комнат.Связанная с LINQ ошибка «Невозможно создать постоянное значение типа« System.Object ». В этом контексте поддерживаются только примитивные типы или типы перечислений.

Я хочу, чтобы получить List<ICollection<rooms>>. Я попытался следующие, и я получаю вышеуказанную ошибку.

Любые идеи ??

public ActionResult _roomChecker(checkRooms JSONdata){ 
     var rooms = db.rooms.Include(r=>r.building).Include(r=>r.facilities); 
     rooms = rooms.Where(r => r.capacity >= JSONdata.capacity); 
     if (JSONdata.type != "Any") 
     { 
      rooms = rooms.Where(r => r.roomType.Equals(JSONdata.type)); 
     } 
     if (JSONdata.park != "Any") 
     { 
      rooms = rooms.Where(r => r.building.park.Equals(JSONdata.park)); 
     } 

     if (JSONdata.facilities != null) 
     { 
      for (var i = 0; i < JSONdata.facilities.Length; i++) 
      { 
       rooms = rooms.Where(r => r.facilities.Any(f => f.facilityName.Equals(JSONdata.facilities[i]))); 

      } 
     } 

     var proposedRequest = db.requests.Include(r => r.rooms); 
     proposedRequest = proposedRequest.Where(r=>r.booked.Equals(1)); 
     proposedRequest = proposedRequest.Where(r => r.roundID.Equals(JSONdata.roundID)); 
     proposedRequest = proposedRequest.Where(r => r.day.Equals(JSONdata.day)); 
     proposedRequest = proposedRequest.Where(s => s.start < JSONdata.start + JSONdata.length && s.start + s.length > JSONdata.start); 
     int[] standardWeeks = new int[12] {1,2,3,4,5,6,7,8,9,10,11,12}; 
     var containsStandard = standardWeeks.Intersect(JSONdata.weeks); 
     if (containsStandard.Count()!=0) 
     { 
      proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week)) || r.weeks.Equals(1)); 
     } 
     else { 
      proposedRequest = proposedRequest.Where(r => r.weeks_request.Any(f => JSONdata.weeks.Contains(f.week))); 
     } 

    //ERROR OCCURS ON THIS LINE BELOW 

     List<ICollection<room>> bookedRooms = proposedRequest.Select(r => r.rooms).ToList(); 


     var deptRooms = db.rooms.Include(r => r.building).Include(r => r.facilities).Where(r => r.belongsTo.Equals(JSONdata.deptCode)); 

     roomCheckerObject suitableRooms = new roomCheckerObject(); 
     suitableRooms.code = JSONdata.deptCode; 
     suitableRooms.roomNo = JSONdata.roomNo; 
     suitableRooms.RequestNo = JSONdata.RequestNo; 
     if(rooms.Count() >0){ 
      suitableRooms.rooms = rooms.ToList(); 
      var buildings = rooms.Select(r => r.building).Distinct(); 
      suitableRooms.buildings = buildings.ToList(); 
     } 
     if(bookedRooms.Count() >0){ 
      suitableRooms.bookedRooms = bookedRooms; 
     } 

     if(deptRooms.Count() >0){ 
      suitableRooms.deptRooms = deptRooms.ToList(); 
     } 
     return PartialView(suitableRooms);} 
+0

@MattSull r.belongsTo - это просто строка, но это внешний ключ. JSONdata является ViewModel – mwild

+1

Вы уверены, что исключение выбрасывается в строке 'List >'? Эта ошибка может произойти с Linq для объектов, когда вы используете '.Equals()' вместо '==', поэтому я спрашиваю. – MattSull

+0

Я не уверен, но может быть, вам нужно использовать SelectMany(), чтобы сгладить список вместо .Select()? – sukotto1

ответ

2

Это своего рода трудно сказать, что именно является причиной но я вижу 3 возможных виновника:

1) Вы используете .Equals() с запросом Linq для сущностей (L2E). Это может вызвать проблемы, см. here.

2) Вы говорите, что ошибка возникает в строке, где объявляется List<ICollection<room>>. В этой строке вы вызываете .ToList() в первый раз в любом из операторов L2E. Только теперь ваш L2E-запрос будет выполнен (see EF Query Execution) по базе данных, что означает, что любая ошибка (с использованием .Equals()) в предыдущем заявлении L2E может вызвать исключение.

3) Действительно ли proposedRequest.Select(r => r.rooms).ToList(); действительно возвращает List<ICollection<room>>? Попробуйте использовать .SelectMany() (хотя это может иметь нежелательные последствия) или для изменения проверки работоспособности List<ICollection<room>> до var, чтобы увидеть, что будет возвращен запрос.

+0

Моя склонность состоит в том, что это часть Select vs SelectMany, так как это коллекция коллекций. Но мне нравится ваша идея _sanity check_ the best – sukotto1

+1

Я прошел и изменил все мои .Equals() на == только ради экономии потенциальных ошибок. Это изначально не решило проблему, поэтому я продолжал менять то, что вы сказали, и ничего не работало. Затем я заметил один последний досадный .Equals и изменил его, теперь нет ошибок :) Спасибо за вашу помощь :) – mwild

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

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