2016-04-26 3 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 Я не хочу получить все записи. Моя база данных большая, а мой, если я получаю все строки, мой запрос занимает много времени.

Мне нужен способ или библиотека, чтобы передать параметр sql и фильтровать данные. ех. pass value Значение и код для SQL.

Я искал в сети NET, но я не могу найти какой-либо подобный вопрос, и у меня нет идеи.

благодаря

+0

Является ли XML таким же простым, как ваш пример? Просто атрибуты-узлы с одним атрибутом кода и одним значением элемента? – Shnugo

+0

да только один узел, но несколько раз каждый атрибут 'может иметь более 5 атрибутов' tag' – temp125050

+0

Остается открытым вопрос? Вам нужна дополнительная помощь? Имейте в виду, что большинство профессионалов, дающих ответы на SO, жаждут точек репутации. [Пожалуйста, прочтите это: кто-то-ответы] (http://stackoverflow.com/help/someone-answers). – Shnugo

ответ

1

Я надеюсь, это то, что вы ищете:

Просто скопируйте всю партию в пустое окно запроса и выполнить. Тогда поиграйте, чтобы выяснить, что лучше работает для вас

--Here ваш XML еще с некоторыми узлами

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 включает в себя «Кодекс» только как атрибут в "атрибут" узла

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: Предложение: Shred вашего XML вернуться рядами

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

--use этого запроса как КТР и сделать вашу фильтрацию с нормальным КУДА

;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