我有一个包含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并在数据库中执行.. ???
提前致谢..
答案 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"));