Linq to sql 如何使用LINQtoSQL和LINQtoXML查询数据库列中的XML数据?
XML: 解决方案 有两个问题 -我猜只有在实际需要结果时才会执行查询。当我从SQL发展到XML查询时,结果查询变成了SQL和XML的混合,因此无法执行。我的解决方案是通过将SQL查询转换为结果列表来强制生成结果。这将LINQSQL与LINQXML分开Linq to sql 如何使用LINQtoSQL和LINQtoXML查询数据库列中的XML数据?,linq-to-sql,linq-to-xml,Linq To Sql,Linq To Xml,XML: 解决方案 有两个问题 -我猜只有在实际需要结果时才会执行查询。当我从SQL发展到XML查询时,结果查询变成了SQL和XML的混合,因此无法执行。我的解决方案是通过将SQL查询转换为结果列表来强制生成结果。这将LINQSQL与LINQXML分开 var all = from bm in MYTABLE select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML}; var docs = fro
var all = from bm in MYTABLE
select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
-第二个问题是,我忘记将名称空间添加到XML查询中。一旦我这样做了,我就得到了要求的结果
var docs = from x in all
select XDocument.Parse(x.xml);
var docs2 = docs.ToList(); // force result
谢谢你的帮助 下面是一个代码片段,它使用了您的代码和MYTABLE的硬编码内容,并且可以通过LinqPad进行完美验证。也许您的数据库表或MYTABLE不包含您认为它所包含的内容?你能检查一下所有测试的结果吗 输出:
var MYTABLE = new [] {
new {
SPP_USER_ID = "XML-SNIPPET-1",
SPP_BOOKMARKS_XML = @"
<root>
<item>
<href>http://myurl</href>
</item>
<item>
<href>http://myurl2</href>
</item>
</root>
",
},
new {
SPP_USER_ID = "XML-SNIPPET-2",
SPP_BOOKMARKS_XML = @"
<root>
<item>
<href>http://google.com</href>
</item>
</root>
",
}
};
var all = from bm in MYTABLE
select new { name=bm.SPP_USER_ID, xml=(string) bm.SPP_BOOKMARKS_XML};
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
foreach (var h in href.SelectMany(h => h))
{
Console.WriteLine(h);
}
希望这有帮助 以下是我尝试过的几件事 设置:我创建了一个数据库,其中有一个表MYTABLE,包含2列。第1列SPP\U USER\U ID为varchar255,第2列SPP\U书签\U XML为XML数据类型。我添加了两行,与mellamokb使用的行一致。我创建了一个LINQ到SQL的设计图面,并将其拖到这个表中。我的应用程序只是一个控制台应用程序,它加载LINQ到SQL数据上下文,然后调用您的命令。 我直接查询数据表,如下所示:
<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
var all = from bm in context.MYTABLEs
select new { name = bm.SPP_USER_ID, xml = (string)bm.SPP_BOOKMARKS_XML };
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
结果是一组IEnumerables。也就是说,对于数据库中的每一行,我都会得到一个包含所有href子体的IEnumerable。在这个场景中,我得到了两个结果;第一个结果是包含2个元素的IEnumerable,第二个结果是包含1个元素的IEnumerable。从你的描述来看,这似乎至少接近你想要的。然而,由于查询的结构方式,您可能看不到预期的结果
请注意,有时很难让VisualStudio实际显示这样的查询结果。我发现,我经常必须先查看该项两次,然后才能启动结果枚举
我试图复制您的OP中编写的代码,如下所示:
<href>http://myurl</href>
<href>http://myurl2</href>
<href>http://google.com</href>
var all = from bm in context.MYTABLEs
select new { name = bm.SPP_USER_ID, xml = (string)bm.SPP_BOOKMARKS_XML };
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");
当我这样做时,它导致xml值被丢弃,因为它已经是一个XDocument,所以将其转换为字符串会导致所有标记被剥离。因此,接下来的两条语句因XML解析异常而失败
你不给我想要的是什么意思?错误的结果?没有结果?慢?@银河牛仔-编辑。希望现在能更清楚地回答另一个问题-您如何从LINQ转换到SQL,并将其称为MYTABLE?或者这是实际context.MYTABLE的伪代码?数据库中SPP\u BOOKMARKS\u XML的数据类型是什么?它是XML数据类型还是varchar?@mellamokb-它是varchar类型有趣的结果。如果将SPP\u BOOKMARKS\u XML更改为varchar数据类型,会发生什么情况?如果我做了更改,则第3项的行为与第2项完全相同。谢谢,但这里的区别是,它完全是linq to XML—这里不涉及SQL。我从'from h in docs'操作中收到一条错误消息,类似于'XDocument.Parse-在SQL中不受支持'。我可以这样混合SQL和XML查询吗?
var MYTABLE = (from bm in context.MYTABLEs select bm).ToList();
var all = from bm in MYTABLE
select new { name = bm.SPP_USER_ID, xml = (string)bm.SPP_BOOKMARKS_XML };
var docs = from x in all
select XDocument.Parse(x.xml);
var href = from h in docs
select h.Descendants("href");