SQL-запрос Entity Framework, вызывающий ошибку преобразования - PullRequest
0 голосов
/ 29 сентября 2019

У меня есть этот простой запрос, в котором я хочу вернуть столбец записи из таблицы, который может быть либо 1, либо 0. Я пытаюсь использовать этот запрос, но получаю ошибку преобразования:

System.InvalidCastException: 'Невозможно привести объект типа' System.Boolean 'к типу' System.Int32 '.'

public int GetUserValidFlag(int userId)
{
    var query = from r in db.VisUsers
                where r.UserId == userId
                select r.IsValid;
    return Convert.ToInt32(query.FirstOrDefault());
}

У меня есть экземпляр db в этом классе.

Контекст:

public class DatabaseContext : DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
    {
    }

    public DbSet<Category> Categories { get; set; }
    public DbSet<SubCategory> SubCategories { get; set; }
    public DbSet<VisUser> VisUsers { get; set; }
    public DbSet<Project> Projects { get; set; }
}

Я также пытался с Find ():

public int GetUserValidFlag(int userId)
{
    var record = db.VisUsers.Find(userId);
    return Convert.ToInt32(record.IsValid);
}

ПРИМЕЧАНИЕ : эти две попытки не достигаютоператоры return, ошибка возникает перед возвратом.

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

1 Ответ

0 голосов
/ 29 сентября 2019

Базы данных обычно хранят логические флаги как битовые поля со значениями 1 или 0. EF отобразит их в сущности как логический тип.Обычно в вашем коде вы просто используете bool в качестве типа данных для методов и свойств для флага, подобного этому.Если вы все еще хотите преобразовать его в Int, тогда вам также необходимо рассмотреть, было ли значение БД нулевым или нет:

Если значение БД не имеет нулевого значения:

return query.Single() ? 1 : 0;

FirstOrDefault следует использовать только с предложением order-by в тех случаях, когда вы ожидаете 0 или много возможных результатов.Если вы ожидаете 1 пользователя с таким идентификатором, используйте Single.Это приведет к исключению, если идентификатор пользователя не соответствует записи или если было возвращено более 1 записи.Использование OrDefault вариантов приведет к сбою, если запись пользователя не найдена.Если вы хотите явно проверить и обработать возможность того, что никакой записи не существует, используйте метод OrDefault, в противном случае лучше обрабатывать его как исключение.

Если значение БД для запроса является нулевым:

bool? isValid = query.Single();
return isValid.HasValue && isValid.Value ? 1 : 0;

Это проверяет значение и возвращает 1, если значение присутствует, и True, в противном случае возвращается 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...