ASP.NET我的Linq代码可以为null的DateTime比较失败

时间:2014-05-29 15:27:15

标签: asp.net linq-to-sql linq-to-xml

我的应用程序允许用户上传XML文件,我将其作为XDocument传递到我的方法中。所有值都是属性字符串,我使用Linq到XML和Linq到SQL。

dateCutoff 查询应该从SQL表中获取最新日期 - InsDate 可以为空。

检查 XML查询中的 where 子句应该在 dateCutoff之后获取 inspection_date 属性值的检查元素价值。我正在使用DateTime.Parse和Date.CompareTo,但是我的空白了。

我错过了什么?非常感谢任何帮助。

        public IEnumerable<XElement> getInspections(XDocument xDoc)
    {
        IEnumerable<XElement> inspections = null;

        using (InspectionDataContext db = new InspectionDataContext())
        {
            // get the latest date already in Inspections table
            DateTime? dateCutoff = (from d in db.Inspections
                                    select d.InsDate).Max();

            if (dateCutoff.HasValue)
            {
                dateCutoff = dateCutoff.Value.Date;
            }

            // get only the inspections later than the dateCutoff
            inspections = from i in xDoc.Descendants("inspections")
                          where DateTime.Parse(i.Element("inspection").Attribute("inspection_date").Value).Date.CompareTo(dateCutoff) == 1
                          select i;
        }
        return inspections;  
    }                                              

2 个答案:

答案 0 :(得分:0)

我在这里做了一些假设因为它写得不完全清楚。 1.您想要返回“检查”元素(而不是“检查”容器元素)。 2.您只想返回日期大于截止值的元素 3.如果截止值为空,则需要返回所有检查。

在这种情况下,你会做这样的事情:

var inspections = xDoc.Descendents("inspection");
if (!dateCutoff.HasValue)
   return inspections;
return inspections.Where(i => (DateTime)i.Attribute("inspection_date") > dateCutoff.Value )

答案 1 :(得分:0)

这是有效的:

            DateTime? dateCutoff;

        using (InspectionDataContext db = new InspectionDataContext())
        {
            // get the latest date already in Inspections table
            DateTime? dateCutoffQ = (from d in db.Inspections
                                     select d.InsDate).Max();

            if (dateCutoffQ.HasValue)
            {
                dateCutoff = dateCutoffQ.Value.Date;
            }
            else
            {
                dateCutoff = DateTime.Now.AddYears(-20).Date;
            }

            string date1 = dateCutoff.ToString();

            // get only the inspections later than the dateCutoff
            inspectionList = from i in xDoc.Descendants("inspection")
                          where DateTime.Parse(i.Attribute("inspection_date").Value).Date > dateCutoff
                          select i;