Excepción del reparto extraño de Linq

Recibo una excepción de reparto muy extraña. La excepción ocurre muy rara vez.

Este es el código:

    protected Guid GetWebsiteLanguage(Guid websiteId, int languageId)
    {
        Guid websiteLanguagesId = Guid.Empty;
        var websites = from item in DataContext.WebsiteLanguages
                       where item.WebsiteId == websiteId && item.LanguageId == languageId
                       select item.Id;

        if (websites.Count() != 1)
            throw new ArgumentException("Wrong channel parameters.");

        try
        {
            websiteLanguagesId = websites.First();
        }
        catch (Exception ex)
        {
            string errorMessage = websites.First() == null ? "websites.First() is null" : string.Concat("Invalid Guid ", websites.First().ToString());
            throw new Exception(string.Concat(ex.Message, " - Log: ", errorMessage, " - Variables: websiteId = ", websiteId.ToString(), " languageId = ", languageId));
        }

        return websiteLanguagesId;
    }

La excepción que obtengo es esta:

El elenco especificado no es válido. - Tronco:

Invalid Guid ef058612-37db-4b02-aa13-5a528819a5e0

Variables: websiteId = db725f45-70fa-4fd0-b344-55bbf17a5c15

languageId = 2057

Esta es la salida de la excepción de la captura. Como puede ver, tenemos un GUID pero aún está dando una excepción de transmisión ...

Y a veces sale mal en el Count () de esta función. Entonces este es el stacktrace:

System.Data.Linq.IExecuteResult Execute (System.Linq.Expressions.Expression, QueryInfo, System.Data.Linq.SqlClient.IObjectReaderFactory, System.Object [], System.Object [], System.Data.Linq.SqlClient.ICompiledSubQuery [], System.Object) STACKTRACE: en System.Data.Linq.SqlClient.SqlProvider.Execute (consulta de expresión, QueryInfo queryInfo, IObjectReaderFactory factory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries), Object lastResueries System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (Expression query, QueryInfo [] queryInfos, IObjectReaderFactory factory, Object [] userArguments, ICompiledSubQuery [] subQueries) en System.Data.Linq.SqlClient.SqlDavider.System. Provider.IProvider.Execute (consulta de expresión) en System.Data.Linq.DataQuery1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable1 fuente) en GetWebsiteLanguage (Guid websiteId, Int32 languageId)

Y cuando esto ocurre, la única solución es hacer un reciclaje del grupo de aplicaciones iis y está funcionando nuevamente.

¿Alguna idea?

Así es como manejo mi contexto de datos

    public MyDataContext DataContext
    {
        get
        {
            //Changed this to make this testable with unit tests
            if (HttpContext.Current != null)
            {
                if (!HttpContext.Current.Items.Contains(DataContextKey))
                    HttpContext.Current.Items.Add(DataContextKey, new MyDataContext(ConnectionString));
                return (MyDataContext)HttpContext.Current.Items[DataContextKey];
            }
            else
            {
                //When context is not available
                if (context == null)
                    context = new MyDataContext(ConnectionString);
                return context;
            }
        }
    }

preguntado el 08 de noviembre de 11 a las 11:11

2 Respuestas

Bueno, no estoy seguro de qué está causando el problema. ¿Pero entiendo que de todos modos siempre puede tener un solo resultado? Entonces, ¿ha considerado no usar Count en absoluto? Además, creo que su First () en la última parte del código no puede ser nulo.

(Si puede tener más de un resultado, use FirstOrDefault en su lugar)

Entonces, ¿por qué no refactorizar para usar SingleOrDefault ():

var websites = (from item in DataContext.WebsiteLanguages 
                   where item.WebsiteId == websiteId && item.LanguageId == languageId 
                   select item.Id).SingleOrDefault(); 

y continuar con

if (websites == null) 
        throw new ArgumentException("Wrong channel parameters."); 

respondido 08 nov., 11:17

No sé si esto resuelve el problema ... Porque las excepciones ocurren a veces en el recuento, pero en otras ocasiones en los sitios web. Primero (); expresión .. Y si sale mal en la primera expresión () es muy extraño que tenga un valor en la excepción. (como se muestra en el ejemplo) - user1035498

¿Y es reproducible: en otras palabras, después de que el grupo de aplicaciones se recicle probando el mismo Guid FUNCIONA o es consistente en no funcionar? - Pleun

Y tiene razón en que puede que no resuelva su problema (aunque probablemente obtendrá un sql diferente generado) en ese caso. Pero una refactorización como esta seguirá mejorando su rendimiento. Pleun

Después de que el grupo de aplicaciones se recicle, el mismo GUID está funcionando. Y después de un período de tiempo (a veces unos meses, a veces semanas), el mismo problema vuelve a repetirse. - user1035498

¿Cómo maneja su contexto de datos? - Pleun

Tuve el mismo problema y lo resolví configurando el Server Data Type propiedad a uniqueidentifier en mi DBML.

Respondido el 23 de Septiembre de 14 a las 18:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.