【问题标题】:how to pass contains filter to sql in LinqToXML如何在 LinqToXML 中将包含过滤器传递给 sql
【发布时间】:2016-04-26 09:30:20
【问题描述】:

我有这样的桌子:

    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 包含在下面的 xml 的行:

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

2:

如何将 xml 字段中的包含过滤器传递给 sql,因为我不想获取所有记录,我的数据库很大,如果我获取所有行,我的查询需要很长时间。

我需要一种方法或库来将参数传递给 sql 并过滤数据。前任。将属性值和代码传递给 SQL。

我在 NET 上搜索过,但我找不到任何类似的问题,我也不知道。

谢谢

【问题讨论】:

  • XML 是否总是像您的示例一样简单?只是具有一个代码属性和一个元素值的属性节点?
  • 是的,只有一个节点,但有时每个 Attributes 可以有超过 5 个属性 tag
  • 这个问题还没有解决吗?您需要进一步的帮助吗?请注意,大多数在 SO 上给出答案的专业人士都渴望获得声誉积分。 Please read this: someone-answers.

标签: c# sql-server xml entity-framework linq


【解决方案1】:

我希望,这就是你要找的:

只需将全部内容复制到一个空的查询窗口中并执行。 然后尝试找出最适合您的方法

--这里有更多节点的 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>';

--问题 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
;

--使用外部参数也可以

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
;

--问题 2:建议:分解您的 XML 以逐行返回

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

--将此查询用作 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;

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

如果您只对一个值感兴趣,这应该是一个标量函数,将值返回给您传入的一个(或多个)参数。

如果您可能对填充过滤器的多个节点感兴趣,您应该创建一个(可内联的)表值函数。

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

【讨论】:

  • 感谢您的帮助,但是我如何在 C# 中使用您的代码,我使用 Entity framework 和 Linq,我应该使用这些提供程序编写查询。
  • @temp125050 我将创建一个 SQL 函数并从 C# 代码中调用它。如果您处理大/多 XML 并且想要在应用程序中执行逻辑,则必须首先加载全部 - 大量流量......
猜你喜欢
  • 2014-09-13
  • 2018-04-14
  • 2012-08-25
  • 2015-03-22
  • 2016-12-11
  • 2016-04-26
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多