2015-05-03 4 views
2

Так что в основном я пытаюсь вернуть набор значений в GridView, который не соответствует ни одному из значений в массиве. Однако, при попытке я получаю ошибкуLINQ to Entities не распознает метод 'Int32 ToInt32 (Boolean)'

LINQ к Entities не распознает метод «Int32 ToInt32 (Boolean)» метод, и этот метод не может быть переведен в выражение магазина.

Вот мой код:

 public List<Room> getAvailRoom() 
    { 
     //Sessions from Default Page 
     DateTime checkedIn = Convert.ToDateTime(System.Web.HttpContext.Current.Session["checkIn"]); 
     DateTime checkedOut = Convert.ToDateTime(System.Web.HttpContext.Current.Session["checkOut"]); 

     //retrieves all the bookings which happen between two dates 
     var booking = (from b in context.Booking 
         where b.departureDate >= checkedIn && b.arrivalDate <= checkedOut 
         select b); 

     //Counts how many rooms are booked during those dates 
     int countRooms = booking.Count(); 

     int[] bookings = new int[countRooms]; 
     foreach (var booktypes in booking) 
     { 

       for (int i = 0; i < countRooms; i++) 
       { 
        //Addings the RoomIds to the array 
        bookings[i] = booktypes.RoomId; 
       } 

     } 
     //Returns values that does not equal to any roomIds within the bookings array. 
     return (from b in context.Room 
       where b.roomId != Convert.ToInt32(bookings.Any()) 
       select b).ToList(); 
    } 

Любые идеи, что я делаю неправильно?

+0

возможно дубликат [Метод не может быть переведен в выражение магазина] (HTTP: //stackoverflow.com/questions/3846716/method-cannot-be-translated-into-a-store-expression) –

+0

Стоит объяснить, почему это происходит. LINQ для объектов в памяти ('IEnumerable ') может обрабатывать любое допустимое выражение C#, потому что lambda компилируется компилятором C# и вызывается просто путем вызова делегата. Другие поставщики LINQ (например, работающие на 'IQueryable ') должны перевести ваши lambdas на что-то другое (например, SQL-запросы). Поскольку не все допустимые выражения C# могут быть переведены на что-то еще (SQL очень ограничен по сравнению с C#), такие провайдеры могут обрабатывать только определенные типы выражений. Итак, вы нашли выражение, которое ваш провайдер не может обработать. –

ответ

0

Вы действительно искали Contains запроса я думаю:

return (from b in context.Room 
       where !bookings.Contains(b.roomId) 
       select b).ToList(); 

Две проблемы с вашим сниппета:

  • Any() возвращает логическое значение - вот не совсем то, что вы хотите
  • You пытаются выполнить Convert.ToInt32 в SQL-сфере - там нет , эквивалентного этому (в основном Linq to Entities не может преобразовать эту часть в SQL запрос), поэтому это не сработает.
+0

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

0

Примечание: «bookings.Any()» вернет истину или ложь, указывающую, есть ли какой-либо элемент в массиве бронирования. Вы получаете эту ошибку, потому что пытаетесь преобразовать логическое значение, которое является результатом выражения «bookings.Any()» для целого числа.

Если то, что вы хотите сделать, это получить все номера не заказали, то я буду рекомендовать

 if(bookings.Any()){ 
     return (from b in context.Room 
      where !bookings.contains(b.roomId) 
      select b).ToList(); 
     }else{ 

     return (from b in context.Room 
      select b).ToList(); 
     } 

значение: если у нас есть какой-либо номер забронирован выбрать те комнаты, которые не забронированы еще выбрать все номера (с нет места забронировано)

Примечание: Pls делает ваше преобразование вне ссылки и использует ваш результат в вашем заявлении о ссылке, если вам нужно сделать преобразование типа. Поскольку это C#, я не вижу, чтобы у вас была проблема с преобразованием типов здесь. Ваши "заказы [i] = booktypes.RoomId;" должен возвращать массив междунара которые не требуют преобразований, т.е. «Convert.ToInt32», но в случае необходимости для этого преобразования сделать это прежде, чем вы, то есть

if(bookings.Any()){ 
     var thebooking = new List<int>(); 
    foreach (var booking in bookings) 
    { 
     thebooking.Add(Convert.ToInt32(booking)); 
    } 

     return (from b in context.Room 
      where !thebooking.contains(b.roomId) 
      select b).ToList(); 
     }else{ 

     return (from b in context.Room 
      select b).ToList(); 
     } 
+0

Я не могу понять значение 'Convert.ToInt32 (bookings.Any())'. Что это значит? – romanoza

+0

проверить обновленный ответ –

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