LINQ: System.Int32 - тип значения, не допускающий значения NULL - PullRequest
5 голосов
/ 25 января 2011

Ошибка: Нулевое значение не может быть назначено члену с типом System.Int32, который является необнуляемым типом значения.Здесь происходит сбой программы:

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

Это странно, потому что я объявил переменную обнуляемой, int?maxTagFrequency тоже не работает ...

Весь запрос LINQ:

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();

}

Ответы [ 3 ]

10 голосов
/ 22 февраля 2012

Попробуйте это:

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

Когда вы помещаете приведение внутрь запроса linq, оно позволяет при необходимости получить нулевой результат целиком.

Я выполнил поиск "linq max on empty sequence", и уместна следующая ссылка: Max или Default?

В частности, на этой странице есть ссылка наэта статья - Здесь предлагается более подробное объяснение того, почему это работает: http://www.interact -sw.co.uk / iangblog / 2007/09/10 / linq-aggregates

1 голос
/ 09 января 2013

Эта ошибка может возникать в LINQ to SQL при извлечении из хранимой процедуры, использующей функциональность X.* SQL.

Явное указание каждого поля в предложении SELECT может решить эту проблему.

Вместо

SELECT * from X

Это исправит ошибку в некоторых случаях

SELECT X.Field1, X.Field2 from X

В частности, эта ошибка иногда возникает, когда существует отношение внешнего ключа, определенное в целочисленных полях, допускающих значение NULL.

0 голосов
/ 07 августа 2012

Это также может быть вызвано недействительными ассоциациями, созданными в DBML через конструктор, или иным образом. В моем случае я поймал ошибку, когда сделал неверную таблицу родителем, когда пытался создать таблицу «один к одному». Итак, что случилось, так это то, что мой класс Linq DBML ожидал запись от своего «родителя», как определено в DBML. Поскольку эта «родительская» таблица на самом деле не была родительской, у нее часто не было соответствующей записи, связанной со столбцом идентификатора, который связывал их. Поэтому, когда это произошло, заполнение моего класса Linq произойдет ошибка при создании / заполнении 3-й строки в моем наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...