Linq to XML single或default

时间:2013-10-25 15:33:15

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

我正在查询xml,我使用singleordefault

存储结果
    var query = from nm in xelement.Descendants("EmployeeFinance")
                where (int)nm.Element("EmpPersonal_Id") == empID
                select new AllowancePaid
                {
                    gradeTaxId = nm.Element("Allow-GradeTax").Elements("Amount").Attributes("BenListId").Select(a => (int)a).ToList(),
                    gradeTaxAmt = nm.Element("Allow-GradeTax").Elements("Amount").Select(a => (double)a).ToList()
                };
    Debug.WriteLine("2");
    var resultquery = query.SingleOrDefault();

现在这一行:var resultquery = query.SingleOrDefault();如果在xml文件中找到则可以正常工作。但是,我有一个案例,我的查询将导致null。如果我没有值,它会在xml文件中生成一个条目,我的查询显然会导致null。我的问题是我如何迎合这一点而不会导致我的程序崩溃。显然,singleordefault()无效。

** * ** * ** * 的** * ** * ** 已编辑 * ** * ** * ** * ** * ** * ** * ** * ***

我读到了目前为止大家所说的内容,但它仍然有问题但是我仍有问题。

    if (query.Count() == 0)
    {
        Debug.WriteLine("NULL");


    }
    else {
        var resultquery = query.SingleOrDefault();             
        Debug.WriteLine("NOT NULL");
    }

OR

        if (query == null)
        {
            Debug.WriteLine("NULL");


        }
        else {
            var resultquery = query.SingleOrDefault();             
            Debug.WriteLine("NOT NULL");
        }

OR

   var resultquery = query.SingleOrDefault();
    if (resultquery == null)
    {
        Debug.WriteLine("NULL Result");
    }
    else
    {
        Debug.WriteLine("NOT NULL");
    }

当if语句的第一部分为true时,我收到System.NullReferenceException错误。一位用户说要执行此操作:var resultquery = query.SingleOrDefault();然后使用我的if..else语句进行比较。但是,我在将query.singleofdefault()分配给resultquery时收到错误。所以我很迷茫..希望有人可以帮忙。谢谢

2 个答案:

答案 0 :(得分:2)

  

我想要了解的是这个。文档说明如果结果查询为0,它将给出一个默认值,如果不是,它将是一个单独的值。那么为什么这不给出默认值呢? [取自评论]

null 是引用类型的默认值。显然,AllowancePaid是一种引用类型(自定义class)。

答案 1 :(得分:1)

找不到值时,您想要的值是多少。

你可以这样做:

if (resultquery == null) { 
   // Logic for No result
} else {
   // Logic for result found
}

或者您可以强制使用默认值

例如

 var resultquery = query.SingleOrDefault() ?? new AllowancePaid();

<强>更新

从发布的评论中看来,空引用异常实际上是在查询本身内引起的,而不是分配给resultquery和稍后使用。

此更新的查询应解决问题

var query = from nm in xelement.Descendants("EmployeeFinance")
            where  nm.Element("EmpPersonal_Id") != null 
                   && (int)nm.Element("EmpPersonal_Id") == empID
                   && nm.Element("Allow-GradeTax") != null
                   && nm.Element("Allow-GradeTax").Elements("Amount") != null
            select new AllowancePaid
            {
                gradeTaxId = nm.Element("Allow-GradeTax").Elements("Amount").Attributes("BenListId").Select(a => (int)a).ToList(),
                gradeTaxAmt = nm.Element("Allow-GradeTax").Elements("Amount").Select(a => (double)a).ToList()
            };

var resultquery = query.SingleOrDefault();

if (resultquery == null) { 
  Debug.WriteLine("NULL Result");
} else {
   // Logic here
}