从数据库获取Xml字段,然后从特定元素获取值

时间:2013-12-02 17:00:59

标签: c# xml linq

我想从xml文档中存储一个特定元素的值,这些值是我从数据库中检索的(当且仅当xml文档具有它时)到一个int列表中。

我已经开始尝试这样做了(messages.MessageXML是SQL Server数据库中的Xml类型):

    List<int> messageXml = (from messages in dbContext.Messages
                               join transactions in dbContext.Transactions
                               on messages.TransactionID equals transactions.TransactionID 
                               where transactions.CreatedOn >= StartDate
                               && transactions.CreatedOn <= EndDate
                               select messages.MessageXML
                               ).ToList();

我想在一个LINQ查询中做什么,或者我需要将messages.MessageXML放入XmlDocuments / Strings的List中,然后尝试以这种方式查询它?我可以这样做,但我更愿意只在一个查询中完成所有操作。

我试图根据我看到的其他一些问题来做这件事:

select messages.MessageXML.Element("IDThatIWant")

但是我一直收到一条错误,指出'string'不包含Element的定义。如果它是我缺少的命名空间,我不确定它是哪一个。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以在select子句中动态创建和取消引用XML-Linq,如下所示:

select XElement.Parse(messages.MessageXML).Element("IDThatIWant")

但是,要分离SQL和XML并包含限制(仅当元素具有属性时),它将类似于:

var messageXml = from messages in dbContext.Messages
                           join transactions in dbContext.Transactions
                           on messages.TransactionID equals transactions.TransactionID 
                           where transactions.CreatedOn >= StartDate
                           && transactions.CreatedOn <= EndDate
                           select messages.MessageXML;

var messages = from m in messageXml select XElement.Parse(m);

var ids = (from msg in messages
            let id = msg.Attribute("IDThatIWant")
            where !String.IsNullOrEmpty(id) 
            select Convert.ToInt32(id)).ToList<int>();