0

我将 Visual Studio 2010 与 c# 和 SQL Management Studio 一起使用。

我正在研究邮箱功能。

我写了一个方法,如果用户点击回复按钮,回复的内容是这样的..

private string adjustContentForReply(List<Guid> sender)
    {
        string content = string.Empty;
        messageID = (Guid)Session["messageID"];

        //haal de ontvangers uit de database van het bericht
        List<Guid> receivers = m.bussinesCollection.BussinesMessageReceiver.GetReceivers(messageID);

        //pas de inhoud van het bericht aan met de details van het vorige bericht
        content = "<br /><br />----------------------------------------<br />";
        content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";
        content += "Onderwerp: " + m.bussinesCollection.BussinesMessage.GetMessageSubject(messageID) + "<br />";
        content += "Van: " + m.bussinesCollection.BussinesPerson.GetFullName(sender[0]) + "<br />";
        content += "Aan: ";

        //Voeg één of meerdere ontvangers toe aan details
        foreach (Guid rec in receivers)
        {
            content += m.bussinesCollection.BussinesPerson.GetFullName(rec);
            if (receivers.Count() > 1)
                content += "; ";
        }
        content += "<br />";
        content += "----------------------------------------<br /><br />";

        //voeg de inhoud van het vorige bericht aan de content
        content += m.bussinesCollection.BussinesMessage.GetMessageContent(messageID);

        return content;
    }

它给了我错误

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";

错误是

你调用的对象是空的。

GetMessageReceiver() 是这样的

public MessageReceiver GetMessageReceiver(Guid msgId, Guid personId)
        {
            var message = from msg in Db.MessageReceivers
                          where msg.MessageID.Equals(msgId) && msg.ReceiverID.Equals(personId)
                          select msg;

          return  message.Count().Equals(1) ? message.First() : null;
        }

当我调试它并获取 messageId 和 BoxOwnerId 并在数据库中触发查询时,它显示给定组合的两行。

谁能帮我?

嘿,问题从那里解决了,现在我可以创建一条回复消息。但是在点击发送按钮页面时,现在在那里抛出了同样的错误。

4

3 回答 3

3

你想拥有

return message.First();

代替

return  message.Count().Equals(1) ? message.First() : null;

null如果有多个结果,您的代码将返回。你说,你提供的 ID 在数据库中有两行,所以你得到null......

您应该使用Firstand not FirstOrDefault,因为如果您的消息始终返回 not 的引用,您的代码的结构只能正常工作null

于 2012-10-01T07:20:32.720 回答
1

如果您在该行收到 NullReferenceException:

content += "Ontvangen op: " + m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner).DateReceived.ToString() + "<br />";

那么null几乎可以在任何地方。除了在这种情况下:显然没有空值,m.bussinesCollection.BussinesMessageReceiver否则你会在几行前得到错误。

所以要么GetMessageReceiverorDateReceived为空。

您确实知道,如果不完全是 1 条消息(所以 0 或 >=2),您的 GetMessageReceiver 方法会返回 null 吗?

于 2012-10-01T07:22:00.320 回答
0

您收到错误是因为您没有检查GetMessageReceiver(). 您要么需要确保GetMessageReceiver不能返回null,要么需要在使用任何函数之前检查返回值

MessageReceiver receiver = m.bussinesCollection.BussinesMessageReceiver.GetMessageReceiver(messageID, boxOwner);
if (receiver == null)
    // handle error
    return;

content += "Ontvangen op: " + receiver.DateReceived.ToString() + "<br />";
于 2012-10-01T07:20:50.697 回答