Linq 與 XML 是一個很好的搭配
但在某些情況之下,會照成效能的浪費,這種特定情況就是當查詢的時後原先XML檔案很大( >10MB)
然後在使用Linq 時 用的又是隱涵數查詢(沒有宣告物件)


Dim queray = from abc in xDoc.Root.Elements("RcpList")
                               select abc.Element("RecipeName")


這樣看起來沒有任何問題,在使用上也沒有任何問題
但問題就發生在使用 queay 的上面

設個中斷點,在查詢之後,然後把滑鼠移動到 queay 上面,會顯示 記憶體查詢
假設我們查詢出來的結果有十筆,當我們要從query裡面把資料取出時
事實上,每取出一次的動作,就是再做一次查詢
十筆資料都拿出來,那就是查詢十次
加上第一次的查詢,一共做了 11次

當原先的資料很大時( >10MB or 5000筆以上的資料  就會很明顯)


這時,查詢時就不能用 隱涵數的方式查詢,在一開始就必須宣告物件
當查詢出來的資料一樣是 XML 格式時,就比較簡單
將最外圍的 XML  標籤框起來就可以了

 Dim SelectData As XElement = <GlassIDList></GlassIDList>
 SelectData = <GlassIDList>
                                 <%= From abc In XquaryGlassIDList.Elements("GlassList") _
                                     Where abc.Elements("OKNG").Value = "NG" _
                                     Select abc _
                                 %>
                             </GlassIDList>

查詢出來的資料是自定議的物件時,就需要自行指定查詢出來的資料位置

自訂議的物件
 Public Structure Keith_Type
        Public MeaDevice As Integer
        Public MeaMode As Integer
        Public inputParameter As Double
 End Structure

 Dim query As Keith_Type() = From RcpList In xDoc.Elements("_strKeith") _
                                                Select New With {.MeaDevice = System.Convert.ToInt32(RcpList.Element("MeaDevice ")), _
                                                .MeaMode = System.Convert.ToInt32(RcpList.Element("MeaMode ")), _
                                                .inputParameter = System.Convert.ToDouble(RcpList.Element("inputParameter "))) _
                                                }
 

如範例,就可以把查詢出來的資料存到自定議的物件  

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Rh 的頭像
    Rh

    程式狂想曲

    Rh 發表在 痞客邦 留言(0) 人氣()