如何使用LINQ进行内部联接

时间:2015-11-05 08:46:53

标签: c# entity-framework linq

我有一个LINQ语句来检查是否有人输入了凭证兑换的URL。我获得此优惠券的方式是使用常规网址,并使用额外的哈希值CampaignID,即名为my VoucherRedemption,如下所示。

if (Request.QueryString["voucherRedemption"] != null)
{

    String VoucherRemption = Request.QueryString["voucherRedemption"];
    MSCDatabaseDataContext MSCDB2 = new MSCDatabaseDataContext();
    var getCampaign = from campaign in MSCDB2.Tbl_Campaigns
                      where campaign.Link.Contains(VoucherRemption) 
                      select campaign;

    var VoucherCampaign = getCampaign.FirstOrDefault();


    campaignName.Value = VoucherCampaign.CampaignName;
    campaignDescription.Value = VoucherCampaign.CampaignDescription;
    txtStartDate.Text = VoucherCampaign.StartDate.ToString();
    txtDateEnd.Text = VoucherCampaign.EndDate.ToString();
    campaignAudience.Value = VoucherCampaign.Target.ToString();
    txtDiscount.Text = VoucherCampaign.Discount.ToString();
    txtTsCs.Text = VoucherCampaign.TermsConditions;
    txtTsCs.ReadOnly = true;
    CalendarExtender1.Enabled = false;
    CalendarExtender2.Enabled = false;
    txtStartDate.ReadOnly = true;
    txtDateEnd.ReadOnly = true;
    txtDiscount.ReadOnly = true;
    txtEmail.Visible = true;
}

现在我不断得到:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

但奇怪的是,昨天它正在发挥作用。但只是昨天。其他日子也没有。不是它再次被打破。有什么方法可以解决这个问题吗?

编辑:我查了那篇文章,似乎仍然无法找到问题所在。它昨天工作了

1 个答案:

答案 0 :(得分:1)

之后没有空检查
 var VoucherCampaign = getCampaign.FirstOrDefault();

这非常危险,因为它可以随时返回默认值(也就是null)。数据库连接可能已失败,您有超时,您的查询没有结果,或者您根本不允许访问数据库。当您尝试使用voucherCampaign时,所有这些都会导致空指针。尝试将其更改为以下内容:

var VoucherCampaign = getCampaign.FirstOrDefault();
if (VoucherCampaign == null) {
//print a error message here so you know soemthing is wrong
return;
}
//rest of your code

它无法解决您获得null的原因。但至少你的应用程序不会在此函数中的空指针上崩溃。如果你想知道为什么你没有得到一个返回更改firstrodefault到第一个并尝试捕获它。 catch块中的异常将包含有关查询无效的原因的更多信息。