linq to sql - 按XML字段中的属性排序

时间:2013-02-20 09:35:19

标签: .net linq

我有一个包含XML字段的SQL表。

我想要做的是从每个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并在数据库中执行.. ???

提前致谢..

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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();

答案 2 :(得分:0)

是的,你要求从Linq到SQL过于匹配。

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

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