2013-09-21 48 views
1

考虑以下几点:转换XML字符串的XDocument

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字符串。

请帮忙。

回答

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可以为空。

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()方法做。

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