2016-04-26 111 views
1

为sql我的表是这样的:如何通过包含过滤器LinqToXML

public class ProductAttributeCombination 
{ 
    public string AttributesXml { get; set; } 
     public XElement AttributesXmlContent 
     { 
      get { return XElement.Parse(AttributesXml); } 
      set { AttributesXml = value.ToString(); } 
     } 
     public List<ProductAttributeXML> ProductAttributesXML 
     { 
      get 
      { 
       return XElement.Parse(AttributesXml).Elements("Attribute").Select(row => new ProductAttributeXML { AttributeCode = Convert.ToInt32(row.Attribute("Code").Value), AttributeOptionCode= Convert.ToInt32(row.Value) }).ToList(); 
      } 
     } 
} 

ProductAttributteXML这样的:

public class ProductAttributeXML 
{ 

    public int AttributeCode { get; set; } 
    public int AttributeOptionCode { get; set; } 
} 

XML结果数据库是这样的:

<Attributes> 
    <Attribute Code="1">2</Attribute> 
    <Attribute Code="2">6</Attribute> 
</Attributes> 

1:

我怎么可以创建一个查询一行xmlfield包含belowe XML:

<Attribute Code="1">2</Attribute> 

2:

我如何可以通过包含过滤器的XML领域的SQL,becuse我不想让所有记录,我的数据库是larg和我的,如果我得到所有行,我的查询需要很长时间。

我需要一种方法或库将param传递给sql和筛选数据。恩。将属性值和代码传递给SQL。

我在网上搜索,但我找不到任何类似的问题,我没有任何想法。

感谢

+0

XML是否像您的示例一样简单?只有一个代码属性和一个元素值的属性节点? – Shnugo

+0

是只有一个节点,但每个'Attributes'有一次可以有超过5个属性'tag' – temp125050

+0

这个问题仍然是开放的吗?你需要进一步的帮助吗?请注意这样一个事实,即大多数在SO上给出答案的专业人士都渴望获得声望点。 [请阅读:人 - 答案](http://stackoverflow.com/help/someone-answers)。 – Shnugo

回答

1

我希望,这是你在找什么:

一大堆刚刚复制到空查询窗口,然后执行。 然后玩找出来了,什么工作最适合你

--Here一些更多的节点

DECLARE @xml XML= 
'<Attributes> 
    <Attribute Code="1">2</Attribute> 
    <Attribute Code="2">6</Attribute> 
    <Attribute Code="3">11</Attribute> 
    <Attribute Code="4">13</Attribute> 
    <Attribute Code="5">16</Attribute> 
</Attributes>'; 

--Question 1(所有假设你的XML包括“守则”只能作为你的XML的 “属性” 节点

SELECT @xml.query('//*[@Code="1"]') AS TheNode 
     ,@xml.query('//*[@Code="1"]').value('.','int') AS TheNodesValue 
     ,@xml.value('(//*[@Code="1"])[1]','int') AS DirectEvaluation 
; 

--The同一属性内是 可以与exteral参数

DECLARE @prm INT=1; 
SELECT @xml.query('//*[@Code=sql:variable("@prm")]') AS TheNode 
     ,@xml.query('//*[@Code=sql:variable("@prm")]').value('.','int') AS TheNodesValue 
     ,@xml.value('(//*[@Code=sql:variable("@prm")])[1]','int') AS DirectEvaluation 
; 

--Question 2:建议:你切丝XML回来逐行

SELECT B.value('@Code','int') AS Code 
     ,B.value('.','int') AS Value 
FROM @xml.nodes('/Attributes/Attribute') A(B); 

--use此查询的CTE,做你的过滤与正常WHERE

;WITH MyCTE AS 
(
    SELECT B.value('@Code','int') AS Code 
      ,B.value('.','int') AS Value 
    FROM @xml.nodes('/Attributes/Attribute') A(B) 
) 
SELECT Code, Value 
FROM MyCTE 
WHERE Code=1; 

如果你想为了使这个尽可能简单,你应该创建一个函数。

如果你只对一个价值感兴趣,这应该是一个标量函数返回值一个(或几个)参数,你的过去。

如果您可能会感兴趣的几个节点fullfilling您的过滤器,你应该创建一个(可内联的)表值函数。

如果您需要进一步帮助,请回来...

+0

感谢您的帮助,但是我如何在C#中使用您的代码,我使用了'Entity framework'和Linq,并且我应该使用这些提供程序编写查询。 – temp125050

+1

@ temp125050我会创建一个SQL函数,并从C#代码中调用它。如果您处理大/多XML,并且您想要在应用程序中执行逻辑,则必须首先加载全部 - 很多流量...... – Shnugo