Linq: сумма int

Я получаю сообщение «Нулевое значение не может быть присвоено члену с типом System.Int32, который является типом значения, не допускающим значения NULL» при выполнении Sum () моего пустого оператора. ResultView работает нормально, но либо

var r = from v in DataContext.Visits
        join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id
        where (bs.CreatedBy == userId) && (v.DateVisited.Year == workDate.Year) &&
        (v.DateVisited.Month == workDate.Month) && (v.DateVisited.Day == workDate.Day) &&
        (v.IsPreviewed == false) && (bs.ProfileProjectId != null)
        select v;

int? number = r.Sum( v => v.Counter);

либо

var r = from v in DataContext.Visits
        join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id
        where (bs.CreatedBy == userId) && (v.DateVisited.Year == workDate.Year) &&
        (v.DateVisited.Month == workDate.Month) && (v.DateVisited.Day == workDate.Day) &&
        (v.IsPreviewed == false) && (bs.ProfileProjectId != null)
        select v.Counter;

int? number = r.Sum(v);

не работает с тем же исключением.


person st78    schedule 12.10.2009    source источник
comment
Обходной путь - проверить Count () перед суммой, но это выглядит довольно глупо.   -  person st78    schedule 12.10.2009


Ответы (3)


Попробуйте это (обновлено):

int number = r.Sum(v => (int?)v.Counter) ?? 0;
person bruno conde    schedule 12.10.2009
comment
Я уже пробовал, ошибка времени компиляции: Оператор '??' не может применяться к операндам типа int и int - person st78; 12.10.2009

Не могли бы вы включить некоторые образцы данных? По крайней мере, вы можете взять r.ToList () и посмотреть значения вручную. Судя по тому, что я вижу, похоже, что все должно работать нормально. Также убедитесь, что v.BaseContentID, bs.Id и v.DateVisited не допускают значения NULL. (особенно столбцы ID). Любые целые числа, допускающие значение NULL, на которые есть ссылка, могут вызвать это исключение. Не только в предложении Select

var r = from v in DataContext.Visits
        join bs in DataContext.BaseContents on v.BaseContentID equals bs.Id
        where (bs.CreatedBy == userId) 
            && (v.DateVisited.Date == workDate.Date)
            && (!v.IsPreviewed) 
            && (bs.ProfileProjectId.HasValue)
        select v;

int? number = r.Sum(v => v.Counter);
person Matthew Whited    schedule 12.10.2009

Похоже, что установка && (v.Counter != null) отфильтрует все нули для этого значения перед вычислением суммы.

person LJM    schedule 12.10.2009
comment
В базе данных и счетчике linq нельзя обнулить :( - person st78; 12.10.2009
comment
Я бы вернулся и попытался выяснить, почему вы вообще получаете какие-либо нули. Если типы не равны нулю и вы используете соединение LINQ (которое совпадает с sql INNER JOIN), вы не должны получать нули. Что-то не сходится. (Наверное, почему вы задаете вопрос). - person LJM; 12.10.2009