1

我有一个 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 并在数据库中执行它..???

提前致谢..

4

3 回答 3

1

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

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

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

于 2013-02-20T09:37:48.177 回答
1

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

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

var query = mContext.Items.Where(i => i.Type == Type && i.UserID == UserID).ToList();
return query.OrderBy(i => i.Description.Attribute("displayName")).ToList();
于 2013-02-20T09:38:34.277 回答
0

是的,您要求从 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"));
于 2013-02-20T09:38:25.570 回答