Linq:Nullable Object必须具有Value

时间:2014-02-10 16:02:14

标签: linq

我的查询如下:

int ID = db.Q_Table.Find(item.PassedInID).ID;

我已经为我的问题找到了一个解决方案,但是我想知道为什么我必须这样写呢

1

Nullable(int) ID = db.Q_Table.Find(item.PassedInID).ID;

2

db.Q_Table.Where(w => w.PassedInID== item.PassedInID).Select(s => s.ID ).SingleOrDefault();

它不会让我把int int<在上面的代码-.- ...

我很好奇为什么我必须将它编码为可以为空的int?我真的不想像第二个解决方案那样编码,因为它的代码更多:)。是的我确保数据库中有值,从下图中可以看到我的数据库不接受空值。

感谢您的回答

enter image description here

4 个答案:

答案 0 :(得分:2)

intNullable<int>int?之间存在差异,您无法直接将Nullable<int>分配给intNullable<T> ),考虑一下:

int? x = 123;
int y = x; //This would be an error

但您可以使用null-coalescing operator

int? x = 123;
int y = x ?? 0;

现在针对您的情况,您的ID似乎是一个映射到数据库中的列,允许null。这将映射到C#Nullable<int>,如果您想将结果分配给int,您可以这样做:

int ID = db.Q_Table.Find(item.PassedInID).ID ?? 0;

如果它是null,那么这将为您的变量赋予ID0的值。

答案 1 :(得分:1)

ID不是int,而是Nullable<int>(或简称int?)。

当底层数据库列可以为空时,通常就是这种情况。

<上没有定义int?运算符。如果你想这样做,你必须首先检查是否存在值:

db.Q_Table.Where(w => w.PassedInID.HasValue && w.PassedInID.Value == item.PassedInID)
  .Select(s => s.ID ).SingleOrDefault();

答案 2 :(得分:0)

这可能是因为db.Q_Table.Find返回一个无效的int。

如果你想

,你也可以做以下事情
int? ID = db.Q_Table.Find(item.PassedInID).ID;

答案 3 :(得分:0)

我想你可以做类似下面的事情,它的代码少了一点:

int? t;

int ID = (t = db.Q_Table.Find(item.PassedInID).ID) == null ? -1 : t;

当然,现在您必须在代码中稍后处理-1 ID作为特殊情况。我希望你只想要一个可以为空的int。