Linq Select Statement не будет работать - PullRequest
1 голос
/ 16 июня 2011

Я получаю следующую ошибку при выполнении следующего запроса

public int getPinCount(int terminalId, ref int pinnumber)
{
         using (var dbEntities = new DatabaseAccess.Schema.BMIEntityModel())
         {
              DateTime dateNow = DateTime.Now;
              return (from pins in dbEntities.PinIds
                              where pin.TerminalID.Equals((int)terminalId) 
                              && pin.PinExpireDateTime < (DateTime)dateNow
                              select pins).Count();
         }
         return 0;
}

Невозможно создать постоянное значение типа 'System.Object'.В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

  • TerminalId = int
  • PinExpireDateTime = datetime

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Если вы сравниваете ints в: pin.TerminalID.Equals((int)terminalId) приведите его перед запросом и используйте ==.

Предполагая, что terminalId это int

pins.TerminalID == terminalId

Я непонять, почему вы используете dateNow на DateTime, это не нужно, так как оно уже DateTime.

0 голосов
/ 16 июня 2011

Пара вещей, которые я заметил здесь.

  1. Вы использовали и pins, и pin, но я думаю, что они должны иметь одинаковый идентификатор.Это может быть просто опечатка от копирования вашего кода в ваш вопрос.

  2. У вас есть несколько ненужных явных приведений, и вы используете метод Equals вместо просто ==.Я не уверен, почему ты это делаешь.Equals переопределяется для Int32, поэтому оно должно быть таким же, как при использовании оператора ==;это должно работать нормально - но я не уверен, откуда еще может появиться эта ошибка.Возможно, что LINQ to Entities не сможет поддерживать отправку Int32.Equals(int) в SQL-запрос, хотя он прекрасно поддерживает Int32.==.

Единственная другая возможность, о которой я могу подумать, это то, что pin.TerminalID или pin.PinExpireDateTime могут быть не точными типами данных, о которых вы думаете, но вы должны проверить это сами.

В любом случае, вы можете хотя бы упростить свой код:

public int getPinCount(int terminalId, ref int pinnumber)
{
     using (var dbEntities = new DatabaseAccess.Schema.BMIEntityModel())
     {
          DateTime dateNow = DateTime.Now;
          return (from pin in dbEntities.PinIds
                  where pin.TerminalID == terminalId
                  && pin.PinExpireDateTime < dateNow
                  select pin).Count();
     }
     return 0;
}
...