2011-01-24 27 views
5

Error: El valor nulo no se puede asignar a un miembro con el tipo System.Int32, que es un tipo de valor que no admite nulos. El programa se bloquea aquí:LINQ: System.Int32 es un tipo de valor que no admite nulos

Nullable<Int32> maxTagFrequency = (from t in tagSummary select t.tagCount).Max(); 

Es extraño, porque he declarado que la variable puede contener nulos, int? maxTagFrequency no funciona bien ...

Todo el LINQ consulta:

private void BindTagCloud() 
{ 

int pro_id = Convert.ToInt32(proj_id); 

    var tagSummary = from af in db.AgileFactors 
       join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
       join s in db.Stories on psf.StoryID equals s.StoryID 
       join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
       join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
       join pro in db.Projects on it.ProjectID equals pro.ProjectID 
       where pro.ProjectID == pro_id && 
        pro.ProjectID == it.ProjectID && 
        it.ProjectIterationID == pim.ProjectIterationID && 
        pim.ProjectIterationMemberID == s.ProjectIterationMemberID && 
        s.StoryID == psf.StoryID && 
        psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 

        select new 
        { 

         Tag = tagGroup.Key, 
         tagCount = tagGroup.Count() 

        }; 

    Nullable<Int32> maxTagFrequency = (from t in tagSummary select t.tagCount).Max(); 

var tagCloud = from af in db.AgileFactors 
        join psf in db.ProjectStoryFactors on af.AgileFactorID equals psf.AgileFactorID 
        join s in db.Stories on psf.StoryID equals s.StoryID 
        join pim in db.ProjectIterationMembers on s.ProjectIterationMemberID equals pim.ProjectIterationMemberID 
        join it in db.Iterations on pim.ProjectIterationID equals it.ProjectIterationID 
        join pro in db.Projects on it.ProjectID equals pro.ProjectID 
        where pro.ProjectID == pro_id && 
         pro.ProjectID == it.ProjectID && 
         it.ProjectIterationID == pim.ProjectIterationID && 
         pim.ProjectIterationMemberID == s.ProjectIterationMemberID && 
         s.StoryID == psf.StoryID && 
         psf.AgileFactorID == af.AgileFactorID 
        group af by af.Name into tagGroup 
        select new 
        { 

         Tag = tagGroup.Key, 
         weight = (double)tagGroup.Count()/maxTagFrequency * 100 
        }; 

    ListView1.DataSource = tagCloud; 
    ListView1.DataBind(); 

} 
+0

posible duplicado de [consulta de Linq con problema de suma anulable] (http://stackoverflow.com/questions/696431/linq-query-with-nullable-sum-problem) – RichardTheKiwi

+0

Todavía no puedo arreglar el problema . – MiziaQ

Respuesta

10

Prueba esto:

int? maxTagFrequency = (from t in tagSummary select (int?)t.tagCount).Max(); 

Cuando se pone el molde dentro de la consulta LINQ que permite que todo el resultado sea nulo si es necesario.

hice una búsqueda de "LINQ máximo en secuencia vacía" y el siguiente enlace es relevante: Max or Default?

En particular en esa página es un enlace a este artículo - Esto ofrece una explicación más detallada de por qué esto funciona : http://www.interact-sw.co.uk/iangblog/2007/09/10/linq-aggregates

0

Esto también puede deberse a asociaciones no válidas que se crean en el DBML a través del diseñador, o de otro modo para el caso. En mi caso, cometí un error al convertir el padre en la tabla incorrecta cuando estaba tratando de crear una tabla uno a uno. Entonces, lo que sucedió es que mi clase Linq DBML esperaría un registro de su "padre" como se define en el DBML. Dado que esa tabla "principal" no era realmente un elemento principal, a menudo no tenía un registro correspondiente asociado en la columna de identificación que los vinculaba. Entonces, cuando esto sucedió, la población de mi clase Linq cometió un error al construir/poblar la tercera fila en mi conjunto de resultados.

1

Este error puede ocurrir en LINQ to SQL cuando se extrae de un procedimiento almacenado que usa la funcionalidad X.* de SQL.

La expresión explícita de cada campo en la cláusula SELECT puede solucionar este problema.

En lugar de

SELECT * from X 

Esto solucionará el error en algunos casos

SELECT X.Field1, X.Field2 from X 

En particular, este error parece ocurrir a veces cuando hay una relación de clave externa definida en campos enteros anulables.

Cuestiones relacionadas