我在Book Store上创建了一个项目并希望提供折扣。我已经使用了XML文件,并尝试使用LINQ查询从该文件中检索数据,但是当我运行项目时,它会给我一个错误NullReferenceException。 这是LINQ查询的代码。
string discountFilePath = HttpContext.Current.Server.MapPath("/App_Data/DiscountSettings.xml");
XDocument xmlDoc = XDocument.Load(discountFilePath);
IEnumerable<XElement> filteredDiscounts;
filteredDiscounts = from d in xmlDoc.Descendants("Discount")
where Convert.ToDateTime(d.Element("StartDate").Value) < DateTime.Now
&& Convert.ToDateTime(d.Element("EndDate").Value) >= DateTime.Now
select d;
XElement discountElement = filteredDiscounts.LastOrDefault();
string discounCategory = discountElement.Element("GenreName").Value;
这是我的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<DiscountDetails>
<Discount>
<GenreName>Biographies</GenreName>
<StartDate>2016-05-01</StartDate>
<EndDate>2016-05-31</EndDate>
<DiscountPercentage>10</DiscountPercentage>
</Discount>
</DiscountDetails>
请帮我解决这个问题
答案 0 :(得分:1)
重要
使用LastOrDefault()
方法时必须明白该方法可以返回对象(default(XElement))
的默认值,并且可以为null,如果value为null,则需要chceck。例如,对于您的代码:
if (discountElement != null)
{
string discounCategory = discountElement.Element("GenreName").Value;
}
执行此操作您的代码很好。问题是StartDate
和EndDate
的XML文件和值。更改标记的值,因为您具有StartDat < DateTime.Now
和EndDate >= DateTime.Now
之类的条件,例如像这样(今天)
<StartDate>2016-05-01</StartDate>
<EndDate>2017-05-31</EndDate>
当
filteredDiscounts.LastOrDefault();
不会返回null,而且一切都会好的。
答案 1 :(得分:1)
检查XML中的日期。 filteredDiscounts 为空,因为您的日期错误且与您的选择无关(今天为2016-06-21
)
在这里,您尝试在null
上调用LastOrDefault:
XElement discountElement = filteredDiscounts.LastOrDefault();