índice puede matriz límites los limites indice fuera excepción estaba encontrar diagrama datos crear controlada comparer columna c# linq linq-to-sql

c# - matriz - system indexoutofrangeexception no se puede encontrar la columna 0



Extraña excepción LINQ(índice fuera de límites) (6)

Diría que tienes un modelo -> desajuste de base de datos en alguna parte. Cuando me pongo tan desesperado como usted en situaciones como esta, usualmente enciendo VS.NET, creo una nueva aplicación de consola, y reconstruyo la sección del DBML que hace referencia a la entidad de interés en esta consulta, y la vuelvo a ejecutar. Puede encontrar que en este tipo de aislamiento, la consulta funciona. ¿Personalizó alguna de las definiciones de su entidad completando métodos parciales, especialmente los que se activan en la creación?

Tengo una mesa, llamaremos a los Users . Esta tabla tiene una única clave principal definida en SQL Server, una ID int ID autoincrement.

A veces, mis consultas LINQ contra esta tabla fallan con un error "Index was outside the range" , incluso las consultas más simples. La consulta en sí no usa ningún indexador.

Por ejemplo:

User = Users.Take(1);

o

IEnumerable<Users> = Users.ToList();

Ambas consultas arrojaron el mismo error. Usando el depurador Visualizer para ver la consulta generada, copio y pego la consulta en SQL y funciona bien. También hago clic en "ejecutar" en el visualizador y funciona bien. Pero ejecutar el código por sí solo arroja este error. No implemento ninguno de los métodos parciales en la clase, por lo que no está sucediendo nada allí. Si reinicio mi depurador, el problema desaparece, solo para volver atrás de nuevo al azar unas horas más tarde. Más críticamente, veo este error en mis registros de errores de la aplicación que se ejecuta en producción.

Hago un montón de LINQ en mi aplicación, contra una docena de entidades diferentes en mi base de datos, pero solo veo este problema en consultas relacionadas con una entidad específica en mi tabla. Algunos google sugieren que este problema podría estar relacionado con una relación incorrecta especificada entre mi modelo y otra entidad, pero no tengo ninguna relación con este objeto. Parece estar funcionando el 95% del tiempo, es solo el otro 5% que falla.

He eliminado por completo el objeto del diseñador y lo he vuelto a agregar desde un navegador de servidor "actualizado", y eso no solucionó el problema.

¿Alguna idea de lo que está pasando aquí?

Aquí está el mensaje de error completo y el seguimiento de la pila:

El índice estaba fuera de rango. Debe ser no negativo y menor que el tamaño de la colección. Nombre del parámetro: índice en System.Data.Linq.SqlClient.SqlProvider.Execute (consulta de expresión, QueryInfo queryInfo, fábrica de IObjectReaderFactory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) en System.Data.Linq .SqlClient.SqlProvider.ExecuteAll (consulta de expresión, QueryInfo [] queryInfos, fábrica de IObjectReaderFactory, Object [] userArguments, ICompiledSubQuery [] subQueries) en System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute ( 1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable expresión) en System.Data.Linq.Table 1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 source, Expression`1 predicate) en MyProject.FindUserByType (String typeId)

EDITAR: según lo solicitado, a continuación se encuentra una copia del esquema de la tabla.

CREATE TABLE [dbo].[Container]( [ID] [int] IDENTITY(1,1) NOT NULL, [MarketCode] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [Description] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [Capacity] [int] NOT NULL, [Volume] [float] NOT NULL CONSTRAINT [PK_Container] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

EDITAR: El seguimiento de pila muestra FirstOrDefault , pero FirstOrDefault el error utilizando Take() y ToList() . El seguimiento de la pila es idéntico entre todos ellos, simplemente FirstOrDefault/Take/ToList . El movimiento hacia abajo de la pila a SqlProvider.Execute es, de hecho, idéntico.


Es casi seguro que esta no será la causa raíz de todos, pero encontré esta misma excepción en mi proyecto y encontré que la causa raíz era que se estaba lanzando una excepción durante la construcción de una clase de entidad. Curiosamente, la verdadera excepción es "perdida" y en su lugar se manifiesta como una excepción ArgumentOutOfRange que se origina en el iterador de la instrucción Linq que recupera el / los objeto / s.

Si recibe este error y ha introducido los métodos OnCreated o OnLoaded en sus POCO, intente recorrer esos métodos.


Este problema se produce debido a que el objeto linq y los campos de la base de datos de esa tabla no son idénticos.


La excepción ocurre en una biblioteca del sistema y tu historia me hace pensar que el problema no está en tu código. ¿Ha cambiado el esquema recientemente? ¿Tu mapeo es correcto?


También tuve este Issue y lo resolví.

Ahora entiendo que el error fue el uso incorrecto del contexto de datos de Linq, pero tal vez mi experiencia todavía pueda ayudar a otros a entender por qué obtienen este error.

El contexto de datos de Linq no está diseñado para ejecutarse simultáneamente. Por lo tanto, la creación de múltiples tareas ejecutando async no es ideal. Inspeccione el siguiente código de muestra para comprender el problema:

using(var ctx = new LinqDataContext()) { List<Task> tasks = new List<Task>(); for(int i=0;i<1000;i++) { var task = Task.Run(() => { var customer = ctx.Customers.SingleOrDefault(o => o.Id == i); customer.DoSomething(); } tasks.Add(task); } Task.WaitAll(tasks); }

En mi caso, estaba pasando el contexto de datos como un parámetro en una pila de llamadas más larga y llamando a los métodos de sincronización a lo largo del camino. Entonces no fue tan obvio como el ejemplo anterior. Pero tal vez esto puede ayudar a alguien más de todos modos :-)


Un tiro en la oscuridad:

Está llamando a MyProject.FindUserByType (String typeId) dentro de un cuerpo de bucle, utilizando la variable de bucle como parámetro.

No use la variable de bucle directamente.

foreach(string s in myTypeList) { //GetUserByType(s); //Ooo, bad string tempstring = s; GetUserByType(tempstring); }

Si este es el caso, actualizaré esta respuesta para explicar por qué el uso de variables de bucle directamente es una mala práctica (después de actualizar la pregunta para mostrar el bucle).