2012-11-25 216 views
4

我有一个问题。也许你们中的一位专家可以在这里帮忙。我查询的表格有2个xml列。我需要对这些列中的xml数据执行查询(在我的高级搜索功能中)。问题是我正在使用实体框架,它不支持。即使我尝试执行“ObjectQuery.Execute”,它也会导致语法错误。那么我在这里有什么选择?实体框架查询Xml

  1. 修改表格并为我需要查询的XML中的数据添加列,以便我可以使用Entity Framework执行操作?
  2. 只为高级搜索使用ODBC,并做常规查询,我可以使用SQLXml?这里存在哪些潜在的威胁(如多重连接,太多连接,设计/建筑师等)?
  3. 或者任何人都可以提出更好的解决方案吗?

感谢,

阿里Nahid

+0

请在例外情况中添加一些细节。正如我的答案中所述,可以使用EF处理XML。 –

+0

我想做这样的事情:

 SELECT it.Id, it.Name, it.SomeData, it2.someotherdata FROM Table1 as it CROSS APPLY it.XmlData.nodes('/FORM/PAGES/PAGE/FIELDS/FIELD[@name="LOCATION"]') location(tRef), Table2 as it2 WHERE it.Id = it2.Table2RefId AND it.Live = 1 AND location.tRef.value('.', 'VARCHAR(MAX)') LIKE '%Venn%' ORDER BY id DESC 

回答

2

EF地图SQL Server的XML类型列的字符串。因此,对于这样的定义:

CREATE TABLE [dbo].[XmlData](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[XmlTestColumn] [xml] NOT NULL 
) 

,你将有以下实体:

public partial class XmlData 
{ 
    public int ID { get; set; } 
    public string XmlTestColumn { get; set; } 
} 

,将能够负载串入的XmlDocument,等等。这是一种方法。

如果你喜欢发出对SQL Server中的原生XML查询,则需要

  1. 定义或选择合适的实体类型;
  2. 使用Database.SqlQuery与您的XML查询:

    VAR的查询= context.Database.SqlQuery(@“SELECT it.Id,it.Name,it.SomeData,t2.someotherdata FROM表1,因为它CROSS APPLY。 ..“);

ObjectQuery对于概念模型工作并且不支持本地查询。

+0

感谢您的回答。但这不是我的问题。这样我需要首先在数据库中查询,而不用查询表格的XML列中的XMLData。然后我将不得不迭代结果集并查询XML数据。 但是SQL Server 2005中还有另外一个功能可以执行XMLSQL查询。在上面的帖子中看到我对你的评论的评论。 谢谢。 –

+1

@AliNahid谢谢澄清,这是有道理的。我已经更新了答案。 –

+0

感谢您的回答。说得通。但我不能确认它现在是否工作,因为我正在运行.NET4,因此我的System.Data.Entity库中没有Database.SqlQuery。为此,我将不得不安装4.5覆盖4.0。但我不能这样做,除非我测试我的当前应用程序中没有任何内容和服务器上一样(因为IIS + Umbraco上有多个应用程序[这是我害怕的地方])。遗憾的是,这可能听起来像是一个危险的更新。 –