linq to sql-处理XML类型的空列

linq to sql-处理XML类型的空列,linq,linq-to-sql,linq-to-xml,Linq,Linq To Sql,Linq To Xml,我使用linq从包含XMLcolumn type为xml的2列的数据库中读取数据 我的问题是,如果xml列为空或xml无效 我得到错误,比如根级别的数据无效。第1行,位置1或缺少根元素。 错误是正确的,因为xml不好,但是如何进入循环以便正确处理错误。。 现在,只要我启动foreach循环,错误就会发生,因此我无法处理单独行/项上的错误 var approvedList = from a in db.FormApproveds join error

我使用linq从包含XMLcolumn type为xml的2列的数据库中读取数据 我的问题是,如果xml列为空或xml无效

我得到错误,比如根级别的数据无效。第1行,位置1或缺少根元素。 错误是正确的,因为xml不好,但是如何进入循环以便正确处理错误。。 现在,只要我启动foreach循环,错误就会发生,因此我无法处理单独行/项上的错误

 var approvedList = from a in db.FormApproveds
                       join error in db.ErrorReportingForms
                       on a.FFormFilled_Id equals error.FormFilled_Id
                       join ff in db.FormFilleds on error.FormFilled_Id equals ff.Id
                       where error.ErrorString == "no error" && ff.CreationDate.Year == year && formIds.Contains(ff.FormTemplate_Id) 
                       select new { FormApproved = a, ErrorReportingForm = error, formName = error.FormName, FormFilled = ff };
 foreach (var item in approvedList) {} //error happens here 

这是因为LINQ提供程序尝试从db列启动XElement,当它无效时,在创建模型对象之前会引发异常。要解决此问题,请尝试将XML的映射类型设置为字符串而不是XElement,然后将其转换为XElement。您可以创建其他分部类并定义解析这些XML的方法:

public partial class ErrorReportingForm
{
    public XElement GetInXml() => XElement.Parse(InXml);

    public void SetInXml(XElement e) => InXml = e.ToString();
}
这只是一个例子。您可以尝试定义一些属性

然后,您可以使用try catch block将其包装:

try
{
    var inXml = item.ErrorReportingForm.GetInXml();
}
catch (...)
{

}

异常被抛出的确切位置是什么?approvedList是一个列表,所以迭代时不会出现错误。我已经添加了一个错误截图approvedList是什么类型的?我看到它被注释掉了。approvedList是一个多表的联接列表,但问题来自一个包含xml列的tableErrorReportingForms。因此,请显示approvedList的定义。它只是没有ToList的db.ErrorReportingForms吗?它工作得很好。。非常感谢。我刚刚创建了一个将xml字符串转换为Xelement或Null的方法,并在使用该值时对其进行了检查