2012-01-31 29 views
1
AdomdCommand cmd = new AdomdCommand(commandText, conn); 
CellSet cs = cmd.ExecuteCellSet(); 

var result = from a in cs 
      select new 
      {...}; 

是否可以使用LINQ從CellSet讀取?我曾嘗試使用DataTable代替CellSet,但速度較慢(例如:我使用DataTable執行需要約45秒的查詢,但使用CellSet需要約5秒)。使用LINQ從CellSet中讀取

嘗試使用LINQ時,我得到的錯誤:

找不到源類型 「Microsoft.AnalysisServices.AdomdClient.CellSet」的查詢模式的實現。 '選擇'未找到。

UPDATE

我已經試過恩里科的建議,到目前爲止,它不返回任何錯誤。接下來的問題是如何讀取單元格中的值。這是我迄今爲止嘗試:

var result = from cell in cs.Cells.Cast<Cell>() 
    select new searchResultsPolicy 
    { 
     PolicyNumber = ... 
     InsuredName = cell.Field<string>("[Insured].[DBA Name].[DBA Name].[MEMBER_CAPTION]"), 
     Agency = cell.Field<string>("[Agency].[Agency Name].[Agency Name].[MEMBER_CAPTION]"), 
     Market = cell.Field<string>("[Market].[Market Name].[Market Name].[MEMBER_CAPTION]"),    
     Revenue = String.Format("{0:#,##0}", cell.Field<double?>("[Measures].[Revenue]") ?? 0), 
     Premium = String.Format("{0:#,##0}", cell.Field<double?>("[Measures].[Premium]") ?? 0) 
    }; 

回答

1

你得到的錯誤是CellSet類本身不實現IEnumerable<T>,這是由LINQ所需的原因。

嘗試對CellSet.Cells屬性執行LINQ查詢。這將返回一個CellCollection對象,它實現了IEnumerable。從那裏你可以很容易地通過使用Enumerable.Cast<T>方法將其轉換爲IEnumerable<T>

AdomdCommand cmd = new AdomdCommand(commandText, conn); 
CellSet cs = cmd.ExecuteCellSet(); 

var result = from cell in cs.Cells.Cast<Cell>() 
      select new 
      { ... }; 

參見:

+0

到目前爲止,它不返回一個錯誤。你能給我一個提示如何從選擇新的單元格中讀取列值?我更新了我的問題。非常感謝! – 2012-01-31 09:02:27

+0

@ile'mngmOff'和'fn'變量有哪些類型? – 2012-01-31 09:11:46

+0

對不起,我忘了更改該變量的名稱。假設它是單元格,而不是mngmOff。我現在已經解決了。你也可以忽略fn,它只是一個用來格式化字符串的函數的名字。 – 2012-01-31 09:17:06