InvalidCastException при преобразовании IQueryable в List

407
05 мая 2017, 15:20

Есть БД SQLite. В ней есть таблица Studios со следующей структурой:

CREATE TABLE Studios (
    id            INT     PRIMARY KEY
                          UNIQUE
                          DEFAULT (0) 
                          NOT NULL,
    name          STRING,
    filtered_name STRING,
    real          BOOLEAN NOT NULL
                          DEFAULT true,
    image         STRING
);

Заполняется она корректно и без ошибок из List.

Взаимодействие через linq2db. Классы-сущности созданы по шаблону, который шёл с библиотекой.

public partial class FiltersDB : LinqToDB.Data.DataConnection
{
    public ITable<Studio>    Studios    { get { return this.GetTable<Studio>(); } }
    public FiltersDB()
    {
        InitDataContext();
    }
    public FiltersDB(string configuration)
        : base(configuration)
    {
        InitDataContext();
    }
    partial void InitDataContext();
}
[Table("Studios")]
public partial class Studio
{
    [PrimaryKey, NotNull    ] public int    id            { get; set; } // int
    [Column,        Nullable] public string name          { get; set; } // string(max)
    [Column,        Nullable] public string filtered_name { get; set; } // string(max)
    [Column,     NotNull    ] public bool   real          { get; set; } // boolean
    [Column,        Nullable] public string image         { get; set; } // string(max)
}
public static partial class TableExtensions
{
    public static Studio Find(this ITable<Studio> table, int id)
    {
        return table.FirstOrDefault(t =>
            t.id == id);
    }
}

Получить значение таблицы пытаюсь следующим методом:

    public static List<ShikiApiLib.Studio> GetStudiosFromDB()
    {
        using (var db = new FiltersDB("Filters"))
        {
            var response = new List<ShikiApiLib.Studio>();
            var table = db.Studios.Select(x => x); //(!)для дебага
            var table1 = table.ToList(); //(!)для дебага
            foreach (var studio in db.Studios.Select(x => x).ToList())
            {
                response.Add(new ShikiApiLib.Studio()
                {
                    id = studio.id,
                    name = studio.name,
                    filtered_name = studio.filtered_name,
                    real = studio.real,
                    image = studio.image
                });
            }
            return response;
        }
    }

на строчке с table1 выскакивает ошибка System.InvalidCastException: "Заданное приведение является недопустимым."

Причём в table отображается следующее:

UPD: Если удалить из таблицы все строки, у которых в столбце image стоит null, то ошибка не появляется =/

Но это не решение проблемы, так как эти строки мне нужны =/

UPD2: С этим столбцом мистика какая-то. Ибо замена null на пустую строку или текст вроде "no_image" перед занесением в таблицу БД не помогает. а удаление этих строк, снова избавляет от ошибки =/

Answer 1

Строка [t1].[real] as [real1] тут ни при чем - это просто назначение псевдонима.

Настоящая проблема - в том, что в БД находятся данные, типы которых не соответствуют указанным. SQLite - нетипизированная СУБД, и типы колонок в ее таблицах - не более чем подсказка (ну и еще они задают порядок колонок).

Проверьте, не лежит ли в вашей базе в колонках id или real вместо числа или булева типа маскирующаяся под них строка.

Также возможно, что тип id на самом деле не int, а long. Проверьте этот вариант тоже. Кстати, в SQLite для первичного ключа использовать long предпочтительнее, это немного ускоряет доступ и уменьшает занимаемое место.

Еще один возможный вариант - в real на самом деле лежит число, а не булев тип. Попробуйте int или long.

READ ALSO
Нули при отображении даты (date) в БД MSSQL

Нули при отображении даты (date) в БД MSSQL

У меня есть значение даты в формате 405

283
null при отправке модели

null при отправке модели

Всем здравствуйтеСтолкнулся с проблемой:мне в приложении надо добавить товар в БД, при этом заранее не известно сколько у него будет разных...

327
Работа атрибута DataSource в #

Работа атрибута DataSource в #

Не могу найти хорошего объяснения работы атрибута [DataSource]Везде работа с таблицами

270
Выборка участка данных из БД

Выборка участка данных из БД

Есть проект использующий C#NET, Entity Framework

255