powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Model + DbContext: Индекс находился вне границ массива
16 сообщений из 16, страница 1 из 1
Model + DbContext: Индекс находился вне границ массива
    #38944014
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема:
Если в Модели есть поля, а в запросе я их не указал, то вываливается сообщение:
Индекс находился вне границ массива
Пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
//Модель
    public class DirMenu
    {
        [Key]
        public int DirMenuID { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Url { get; set; }

        public string Controller { get; set; }
        public string Action { get; set; }
    }
...
//В Контроллере
    //Это класс " : DbContext"
    using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        //тут ошибка!!!
        var dirMenu = con.DirMenus.SqlQuery("SELECT Name, Url FROM DirMenus").ToList();
    }



При таком запросе вывалится ошибка
А если укажу все поля из модели ошибки не будет.
Ну так если в Модели 100 полей и я хочу сделать сложный запрос с JOIN-ами, то мне что надо указывать все поля всех задействованных таблиц???
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944019
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
var dirMenu = con.DirMenus.Select(n => new DirMenu() { Name = n.Name, Url = n.Url }).ToList();


Только DirMenu при таком подходе не будет сущностью, частью контекста, лучше для таких выборок использовать специальный класс, чтобы не путать с сущностями
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944022
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
var dirMenu = con.DirMenus.Select(n => new DirMenu() { Name = n.Name, Url = n.Url }).ToList();


Linq не юзаю, мне бы SQL-заросами.
Использую SQLite, а там при сложных запросах надо указывать используемые индексы, если в плане запроса они не задействованны.

То есть для каждого запроса свой класс создавать? Или создать один класс для всех запросов? И не задействовать его в классе "Контекст данных"?
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944023
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkin,

Нет перечислять поля не надо. Если задача вернуть тип "DirMenus", то можно указать все поля сущности так "SELECT DirMenus.* FROM DirMenus". Ежели нужно вернуть не совпадающий спикос полей, то нужно делать так...

Код: c#
1.
2.
3.
4.
5.
6.
 using (var ctx = new SchoolDBEntities())
    {
        //Get student name of string type
        string studentName = ctx.Database.SqlQuery<string>("Select studentname 
            from Student where studentid=1").FirstOrDefault<string>();
    }
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944025
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter string studentName = ...
А надо получить если список студентов?
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944029
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkin,

Код: c#
1.
List<String> studentName = db.Database.SqlQuery<String>("Select studentname from Student").ToList();
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944035
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter
Полей много.

Создал дополнительный класс DirMenuSQL с аналогичными полями "DirMenu", только без ключей и т.д. А так же не задействовал его в " : DbContext"
Код: c#
1.
2.
3.
4.
    using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        var dirMenu = con.Database.SqlQuery<DirMenuSQL>("SELECT Name, Url FROM DirMenus where ...").ToList();
    }



Вылетает ошибка:
Код: plaintext
1.
2.
3.
Исключение типа "System.Data.SQLite.SQLiteException" возникло в EntityFramework.dll, но не было обработано в коде пользователя
Дополнительные сведения: out of memory
unknown error
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944038
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkin
Код: c#
1.
2.
3.
4.
5.
using (Models.DbConnection con = new Models.DbConnection("..."))
    {
        //тут ошибка!!!
        var dirMenu = con.DirMenus.SqlQuery("SELECT Name, Url FROM DirMenus").ToList();
    }


При таком запросе вывалится ошибка
А если укажу все поля из модели ошибки не будет.
А если добавить поле с PK? Т.е. DirMenuID.
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944041
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkinДополнительные сведения: out of memoryЗначит дофига засосал:) Синтаксис правильный.
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944224
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки заработало, но ...
Создал дополнительный класс DirMenuSQL с полями, которые участвуют в выборке.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public class DirMenuSQL
    {
        [Key]
        public int DirMenuID { get; set; }
        public string Name { get; set; }
        public int SubID { get; set; }
        public string Url { get; set; }
        public string SubUrl { get; set; }
    }


И прописал в классе DbConnection : DbContext
Код: c#
1.
2.
3.
4.
5.
6.
7.
    public class DbConnection : DbContext
    {
        public DbConnectionSQLite(string connString) : base(new SQLiteConnection(connString), true) { }

        public DbSet<Dir.DirMenu> DirMenus { get; set; }
        public DbSet<Dir.DirMenuSQL> DirMenuSQLs { get; set; }
    }


И всё заработало.

Как я понимаю, для каждого запроса надо плодить свой класс с полями, которые задействованы в запросе?
Я уверен на 100500%, что ошибаюсь, т.к. это полный бред. У меня к одной таблице может быть и 1000 запросов, это плодить 1000 классов? А сложные запросы, в которых задействованы 10-ки таблиц? А пользовательские запросы, что с ними делать?

Вопрос: где ошибаюсь ...
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944423
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас entity framwork?
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944624
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да.
6.1.2
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944637
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нафига вы пишите тогда запросы на скул вместо линку , где сможете скинуть в анонимный объект?) конечно дальше локального методы вы не пропихнете анонимный объект а если дальше то придется делать некое dto. и это нормально. Если вы хотите сделать модель отличную от целевой вам придется делать некие dto сущности
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944696
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu а нафига вы пишите тогда запросы на скул вместо линку
Чуть выше писал:
potkinLinq не юзаю, мне бы SQL-заросами.
Использую SQLite, а там при сложных запросах надо указывать используемые индексы, если в плане запроса они не задействованны.

Посмотрел как Линк формирует запросы, мне не понравилось. Если честно, то я не тестил, но уверен, что скорость выполнения будет выше, если писать ручками. Хотя элементарные запросы будут и на Линке.

handmadeFromRuЕсли вы хотите сделать модель отличную от целевой вам придется делать некие dto сущности
?
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944777
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkin, извиняюсь что не понял сразу. вы хинты чтоль юзаете чтоб явно указать индекс?

Entity Framework: SqlQuery does not support mapping
http://bartwullems.blogspot.ru/2014/06/entity-framework-sqlquery-does-not.html
вам придется делать классы под каждый запрос, если вы не хотите использовать линку синтаксис.

п.с. зачем вам тогда орм если вы используете голые запросы ? легкий врапер над адо и вперед. или даж лучше dapper используйте, он как раз таки может память на частичные сущности.
...
Рейтинг: 0 / 0
Model + DbContext: Индекс находился вне границ массива
    #38944974
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu
В SQLite можно в самом запросе указать индекс, который надо задействовать.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Model + DbContext: Индекс находился вне границ массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]