转换为值类型“int32”失败,因为实现值为null

时间:2013-04-15 04:52:40

标签: c# wpf asp.net-mvc linq

以下是我的代码,当我从GameByGameTypes和Categories中获取值时,但在名为GameByGameTypes的表中,ColumnId列具有NULL值。所以我想要0 inplace of NULL

  Category objCategory;
                var query = (from gametypebygametype in db.GameByGameTypes.Where( x => x.GameTypeId == gametypeid)
                             join category in db.Categories
                             on gametypebygametype.CategoryId equals category.CategoryId into joined
                             from category in joined.DefaultIfEmpty()
                             select new 
                             {
                                 category.CategoryId ,
                                 category.CategoryName
                             }
                             ).Distinct();
                List<Category> objlistCategory = new List<Category>();
                foreach (var item_temp in query)
                {
                    objCategory = new Category();
                    objCategory.CategoryId = item_temp.CategoryId;
                    objCategory.CategoryName = item_temp.CategoryName;
                    objlistCategory.Add(objCategory);

                }

3 个答案:

答案 0 :(得分:4)

或者你可以替换

select new 
{
    category.CategoryId,
    category.CategoryName
}

select new 
{
    CategoryId = category.CategoryId ?? 0,
    CategoryName = category.CategoryName ?? "",
}

如果您使用ReSharper,它会'抱怨'不需要?? 0部分。忽略它。

您使用的Linq代码已转换为SQL。当你执行它时 - 结果为空,但是强类型编译器不能相信它,并等待不可为空的值。 (这是'物化'的过程,但失败了)。 所以你只是'提示'编译器,它可能是null。

Here is related question

答案 1 :(得分:0)

您有三种方法可以解决这个问题:

  1. 您可以在数据库not null中设置列,并将默认值设置为第0列。

  2. 您可以设置类别属性int? CategoryId

  3. 您可以将查询更改为使用默认值

    的DefaultIfEmpty
            var query = (from gametypebygametype in db.GameByGameTypes.Where( x => x.GameTypeId == gametypeid)
                         join category in db.Categories
                         on gametypebygametype.CategoryId equals category.CategoryId into joined
                         from category in joined.DefaultIfEmpty( new 
                                                                 {
                                                                    CategoryId=0, 
                                                                    Categoryname=""
                                                                 })
                         select new ...
    

答案 2 :(得分:0)

尝试使用GetValueOrDefault

Category objCategory;
                        var query = (from gametypebygametype in db.GameByGameTypes.Where( x => x.GameTypeId == gametypeid)
                                     join category in db.Categories
    on new {A = gametypebygametype.categoryID.GetValueOrDefault(0)}
                equals new {A = category.categoryID}
     into joined
                                     from category in joined.DefaultIfEmpty()
                                     select new 
                                     {
                                         category.CategoryId ,
                                         category.CategoryName
                                     }
                                     ).Distinct();
                        List<Category> objlistCategory = new List<Category>();
                        foreach (var item_temp in query)
                        {
                            objCategory = new Category();
                            objCategory.CategoryId = item_temp.CategoryId;
                            objCategory.CategoryName = item_temp.CategoryName;
                            objlistCategory.Add(objCategory);

                        }