2013-09-16 1 views
-2

Я пытаюсь получить доступ к данным из моей базы данных с помощью LINQ, но я столкнулся с ошибкой типа данных.Доступ к базе данных с LINQ, конфликтом типа данных

Вот мой код:

public static String GetCheckIfCsIsRunning() 
{ 
    using (Entities db = new Entities()) 
    { 
     Stringl status = (from stat in db.Messenger_Settings 
          where stat.Id == 1 
          select stat.SettingValue); 
     return status; 
    } 
} 

В настоящее время я получаю сообщение об ошибке при

where stat.Id == 1 

говоря

Cannot implicitly convert type 'int' to 'bool' 

Я пытаюсь выбрать из моей таблицы идентификатор строка, но строка кода говорит, что Id - это тип bool? Возможно, переменная «status» кода создает «stat» в тип bool. Но как выбрать строку в соответствии с идентификатором?

моя структура таблицы

ID (int) | Имя (varchar) | SettingValue (VARCHAR)

EDIT

Я забыл добавить дополнительный '=' ('=' -> '==')

EDIT-2

заменено на int с ошибкой bool возникает ошибка - данные, к которым я хочу получить доступ, - varchar (выберите stat.SettingValue)

Cannot implicitly convert type 'System.LINQ.IQueryable,string.' to 'string' 
+1

Вы получаете ту же ошибку в той же строке, «не может неявно преобразовать тип« int »в« bool »? –

+0

@JimDagg извините, мне потребовалось некоторое время, чтобы моя Visual Studio загрузила правильное исправление. Спасибо за вашу помощь! – Liondancer

+1

Если вы сообщите нам, что такое сообщение об ошибке, и где оно происходит, мы, вероятно, сможем решить эту проблему. –

ответ

2

Вы ошибочно используете оператор присваивания (=) вместо оператора равенства (==).

Ваша линия

where stat.Id = 1 

фактически присваивает 1 до stat.ID, не то, что вы хотите на всех; то присваивание возвращает назначенное значение, в этом случае 1.Поскольку C# не будет неявно конвертировать int в bool, вы получите сообщение об ошибке. Вместо этого вы должны использовать оператор ==, оператор равенства, который будет делать то, что вы ожидаете: проверьте, является ли значение stat.Id равным 1 и возвращает true или false.

Кроме того, для дальнейшего использования, вы можете избежать случайных ошибок присваивания, как это с помощью другого программирования идиомы: положить константу первой, т.е.

1 = stat.Id 

В то время как вы все еще получаете ошибку в любом случае здесь, в других случаях, когда вы выполняете случайное задание, или на языках, которые будет, неявно конвертировать в bool (что было бы ошибкой во время выполнения, которую трудно отследить), вместо этого вы получите ошибку, поскольку вы не можете назначить значение для числового литерала, например 1.


За ваше редактирование LINQ всегда возвращает «ленивый» запрос. Как только вы попытаетесь получить доступ к любым элементам этого запроса, он перечисляет его. IQueryable - это объектное представление этого запроса. Поскольку мы знаем, что запрос представляет собой последовательность string с (0 или более), мы можем назвать одним из нескольких методов против IQueryable<string>, чтобы получить на результатах:

  • .First() возвращает первый элемент в последовательности, и бросать, если в последовательности нет элементов.
  • .FirstOrDefault() вернет первый элемент в последовательности или значение по умолчанию, если последовательность не содержит элементов.
  • .Single() вернет элемент, если в последовательности есть только один элемент, и в противном случае выбрасывает (если есть ноль или более одного элемента).
  • .SingleOrDefault() вернет элемент, если в последовательности есть только один элемент, значение по умолчанию, если нет элементов, или выброс, если их больше одного.

Какой из них выбрать, зависит от схемы вашей базы данных, а также от желаемого поведения приложения. Если вы знаете, что для настройки будет только одно и ровно одно значение, используйте .Single(), чтобы вы могли ошибиться и определить, получили ли вы несколько результатов. Если может быть значением, это значение для параметра (или оно может не быть определено), используйте .SingleOrDefault(). И если параметр может иметь несколько значений в таблице, используйте .First() или .FirstOrDefault().

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

2

= является оператором присваивания.

Вы хотите сравнить два значения с помощью оператора сравнения ==.

1

Здесь я вижу две проблемы.

Прежде всего, вы пытаетесь передать строку (varchar) в int.

Во-вторых, у LINQ вы создадите что-то вроде IEnumerable или IQueryable, которые не смогут попасть в int.

Вы, вероятно, следует рассмотреть возможность получения First, FirstOrDefault, Sinle, SingleOrDefault

1

where stat.Id = 1 потребности быть where stat.Id == 1

Вы пытаетесь установить значение, а не делать сравнение.

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