为什么我需要转换这些返回的结果?

时间:2011-03-22 16:11:33

标签: c# .net linq casting

    // Insert new record
    ArtworkingDataContext dc = new ArtworkingDataContext();
    tblArtworkData NewRecord = new tblArtworkData()
    {
        dateCreated = DateTime.Now,
        templateID = TemplatesID,
        userID = UsersID
    };
    dc.tblArtworkDatas.InsertOnSubmit(NewRecord);

    // Set new values
    this.Loaded = true;
    this.ID = NewRecord.ID;
    this.DateCreated = (DateTime)NewRecord.dateCreated;
    this.TemplateID = (int)NewRecord.templateID;
    this.UserID = (int)NewRecord.userID;
}

当我设置新值时,ID不需要转换,但其他人都需要转换,否则我得到:

Cannot implicitly convert type 'int?' to 'int'.

我已经厌倦了投出所有返回的数据,我做错了什么?为什么ID不需要演员?

9 个答案:

答案 0 :(得分:6)

除了这里的所有其他答案之外 - 这可能表明数据库设计中的一个更大的问题是Linq to Sql Mapping。

您的对象显然希望始终提供这些值;但数据库列必须可以为空。如果表中的数据永远不会为null,那么你应该将它们设为NOT NULL,然后将设计器中的每个属性的'Nullable'属性设置为'false'

然后,您将不再需要演员或.HasValue支票。

同样,您可以这样做而不是:

Value = nullable ?? default_Value;

default_Value是某种哨兵整数 - 例如-10

答案 1 :(得分:2)

您无需将int?投射到int,而只需在对象上使用.Value(或者更确切地说,使用GetValueOrDefault()扩展方法对你来说更安全)。该错误只是抱怨您将可空类型传递给不可为空的属性。

答案 2 :(得分:2)

似乎NewRecord.templateIDNewRecord.userID在C#中的类型为Nullable<int>int?

一个包装类,在这种情况下,Int32为空。

ID字段可能在数据库中设置为“not null”。查看您的数据库架构,templateID和userID可能允许空值,这些空值将转换为Nullable<T>类型。

Nullable Structure

答案 3 :(得分:2)

  

我做错了什么?

如果数据记录中的值是int?类型,并且您填充的对象具有类型int的属性,那么您做错的第一件事就是强制转换。而不是因为一直写(int)很无聊。这样:

this.UserID = (int)NewRecord.userID;
InvalidOperationException包含NewRecord.userID时,

将抛出null。在那里,现在无聊的东西以你不想要的方式变得令人兴奋。

对此有两种可能的回应:

  1. “但这绝不会发生。”在这种情况下,修复创建NewRecord的任何内容,使其属性不可为空。您可能会发现是的,实际上它可能会发生,因为数据库中的基础列可以为空。

  2. “好的,因为数据库列可以为空,我猜它可能会发生。”在这种情况下,您需要找出为什么列可以为空。如果用户ID包含NULL,这意味着什么,以及应用程序应该做什么?您可能会发现需要创建本地对象的属性int?而不是int,然后包含处理其值为空的情况的逻辑。

  3. 很多人建议你使用null合并运算符或其他一些分配默认值的方法。有时这是一个好主意 - 如果你知道空值应该是什么意思。但是使用??分配哨兵值的想法并没有真正解决问题,而是将已经完全可服务的哨兵值 - null - 改为只有在可以的情况下才有效的值。 t自然地出现在价值空间中。有时您必须这样做 - 例如,如果您正在谈论一些不支持空值的代码 - 但这是您应该非常不情愿地做的事情。

答案 4 :(得分:1)

你必须检查可以为空的值是否有值。

int x;
int? nullable;

if(nullable.HasValue)
   x = nullable;

原因是int!= int?

INT?

只是一个简短的表格
  

Nullable<int>

答案 5 :(得分:1)

我猜这些字段在数据库中是Nullable。

由于数据可能为空,因此C#将这些数据映射到Nullable数据字段 - 例如int?(这是Nullable<int>的简写)

您应该使用.HasValue检查null,然后使用.Value属性 - 或者您可以使用null合并运算符 - ??

,而不是强制转换它们。

如果你想避免这种转换,那么我能想到的唯一方法是更改​​数据库,使这些字段不能为空(也可能为它们提供默认值)


您的ID字段在数据库中不可为空 - 因此它在您的C#中表示为int而不是int?

希望有所帮助

斯图尔特

答案 6 :(得分:1)

您需要this.DateCreated = NewRecord.dateCreated.GetValueOrDefault();

之类的内容

答案 7 :(得分:1)

我不认为这与Linq有关。编译器告诉您Nullable<T>T之间没有隐式转换。显然,对于正常值,演员很容易。但如果dateCreatednull

,它不知道该怎么办

答案 8 :(得分:1)

TemplateID和UserID不是int System.Nullable<int>,这就是你必须强制转换它们的原因。制作this.TemplateId和This.UserID Nullable<int> 或者在Nullable对象上使用.Value属性。