2013-02-20 38 views
1

我有一個SQL表,它包含一個XML字段。linq to sql - 在XML字段中按屬性排序

我想要做的是通過在每個XML字段的數據的根元素的屬性排序的SQL表中獲取的所有數據..

所以我有一個項目表與「用戶ID 「(guid),」描述「(xml)和」類型「(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屬性(System.Xml.Linq.XName)' 有沒有支持轉換爲SQL

我是從linq問得很多.. ???當然不是..或者我應該咬一口子,並創建一個SQL sproc,並在數據庫中做到這一點.. ???

在此先感謝..

回答

1

LINQ到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(); 
+0

謝謝Yaakov ..這與輕微的mod工作...我結束了使用OrderBy(i => i.Description.FirstAttribute.Value)... 但是你肯定讓我朝着正確的方向前進..非常感謝... – Ads 2013-02-20 11:20:55

1

你不能這樣做linq2sql! linq的結果是一個SQL查詢,你在linq2sql中使用的thw函數是.net函數,它沒有SQL中的任何實現函數。 你可以得到所有的數據列表和按代碼排序(更多時間!!!)

在該轉換期間,它只是一個方法調用,沒有更多。 Linq to Sql理解某些方法調用,而你不是其中之一。因此錯誤。

在表面上,這似乎應該工作。您編寫可重用的查詢並從其他查詢中撰寫這些查詢。但是,實際上你說的是:「在數據庫服務器上的每一行處理過程中,調用這個方法」,這顯然不能做到。事實上,這需要一個IQueryable<T>並返回IQueryable<T>並沒有特別的。

+0

錯誤我沒有輸入所有答案,對不起。 – 2013-02-20 09:45:49

+0

感謝一個人船員...這是很好的背景信息... – Ads 2013-02-20 11:22:32

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"));