2016-04-26 104 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