【问题标题】:linq to sql - sort by attribute in XML fieldlinq to sql - 按 XML 字段中的属性排序
【发布时间】:2013-02-20 09:35:18
【问题描述】:

我有一个 SQL 表,其中包含一个 XML 字段。

我想要做的是从每个 XML 字段的数据中按根元素的属性排序的 SQL 表中获取所有数据..

所以我有一个包含“userid”(guid)、“description”(xml)和“type”(int)的项目表。

单个记录如下所示:

1205159E-B4F9-41A9-955E-A3554AF1F21A
1
<book displayText="new book">
    <txtTitle>new book</txtTitle>
    <txtSubTitle>book 1</txtSubTitle>
    <txtAuthor>book 1 author</txtAuthor>
</book>

我正在尝试按“displayText”返回排序列表.. 基于简单文本的排序..

我试过了

return (from i in mContext.Items
        where i.Type == Type
          &&  i.UserID == UserID
        orderby (string)i.Description.Attribute("displayName")
        select i).ToList();

但我不断收到: 方法“System.Xml.Linq.XAttribute Attribute(System.Xml.Linq.XName)”不支持 SQL 转换

我对 linq 的要求太高了吗????当然不是..还是我应该硬着头皮创建一个sql sproc并在数据库中执行..???

提前谢谢..

【问题讨论】:

    标签: .net linq


    【解决方案1】:

    Linq-to-Sql 无法解释该属性 - 它在向 Sql Server 的转换中没有并行,因此当它被提交时,它会返回您收到的错误。

    您仍然可以使用诸如只能在客户端访问的属性之类的东西来执行与 Linq 相关的操作。为此,您首先需要将数据带到客户端(在 Linq-to-Sql 查询上使用ToList() 命令),然后在本地对其进行排序。例如:

    var query = mContext.Items.Where(i => i.Type == Type && i.UserID == UserID).ToList();
    return query.OrderBy(i => i.Description.Attribute("displayName")).ToList();
    

    【讨论】:

    • 谢谢 Yaakov .. 这与一个小模型一起工作...我最终使用 OrderBy(i => i.Description.FirstAttribute.Value)... 但你肯定让我在右边方向..非常感谢...
    【解决方案2】:

    你不能通过 linq2sql 做到这一点! linq 的结果是一个 SQL 查询,你在 linq2sql 中使用的函数是 .net 函数,在 SQL 中没有任何实现函数。 您可以将所有数据放入 List 并通过代码对其进行排序(更多时间!!!)

    在转换过程中,它只是一个方法调用,仅此而已。 Linq to Sql 了解某些方法调用,而您的方法调用不是其中之一。因此出现错误。

    从表面上看,这似乎应该可行。您编写可重用的查询并从其他查询中组合它们。但是,您实际上是在说:“在数据库服务器上处理每一行的过程中,调用此方法”,这显然是做不到的。它接受IQueryable&lt;T&gt; 并返回IQueryable&lt;T&gt; 的事实并没有使它特别。

    【讨论】:

    • 误输入了所有答案,对不起。
    【解决方案3】:

    是的,您要求从 Linq 到 SQL 的匹配度太高了。

    您需要通过 Linq to SQL 或 Linq to Entities 从数据库中检索 Xml,然后使用 Linq to Xml 处理内存中的数据。

    return  mContext.Items.Where(i => i.Type == Type && i.UserID == UserID)
                    .ToList()
                    .OrderBy(i => (string)XElement.Parse(i.Description)
                                                  .Attribute("displayName"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多