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

时间:2018-07-26 12:17:01

标签: linq linq-to-sql linq-to-xml

我正在使用linq从具有2列的包含XML(列类型为xml)的数据库中读取 我的问题是,如果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 

Error here

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

    public void SetInXml(XElement e) => InXml = e.ToString();
}

那只是一个例子。您可以尝试定义一些属性。

然后您可以使用try-catch块将其包装:

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

}