将xml字符串从实体框架查询转换为xdocument

时间:2013-09-21 00:55:55

标签: c# xml linq entity-framework linq-to-xml

请考虑以下事项:

public static XDocument GetMarkupXml( int baxId ) {
    using ( var context = new Sys.EntityModels.BfxEntities() ) {
        var markupXml = context.Baxes
            .Where( b => b.BaxId == baxId )
            .Select( b => b.BaxXml );

        return XDocument.Parse( markupXml );
    }
}

这不是编译。它在“XDocument.Parse(markupXml)”上出错。错误信息是:'System.Xml.Linq.XDocument'的未知方法'Parse(System.Linq.IQueryable)'

我对EF很新,但我确定我的错误是我的“markupXml”没有针对数据库执行,也没有检索到我存储在那里的xml字符串。

请帮忙。

2 个答案:

答案 0 :(得分:0)

您需要执行查询。目前markupXml是一个iqueryable ..尚未执行。

更改

var markupXml = context.Baxes
            .Where( b => b.BaxId == baxId )
            .Select( b => b.BaxXml );

var markupXml = context.Baxes
            .Where( b => b.BaxId == baxId )
            .Select( b => b.BaxXml ).FirstOrDefault();

虽然markupXml可能为null。

答案 1 :(得分:0)

好的,所以有几件事。另外,我假设BaxXml是一个字符串。

首先,您的查询是IQueryable<string>,这意味着它可能包含多个项目。 XDocument.Parse需要string个参数。如果这是合乎逻辑的,请尝试使用First()

string markupXml = context.Baxes
    .Where( b => b.BaxId == baxId )
    .First()
    .BaxXml;

其他选项包括FirstOrDefault()Single()SingleOrDefault()。如果使用“OrDefault”方法,请确保检查该值是否为空。

其次(从错误文本中),您正尝试在sql中执行c#函数。这可能听起来有点奇怪,但请以此代码为例:

var someItems = context.Baxes.Select(x => b.BaxXml.ToString());

这会导致您遇到同样的错误,因为sql不知道如何使用ToString()方法。

要解决此问题,请在执行c#函数之前使用ToList()强制查询从数据库中提取数据。