2
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 时遇到的错误:

找不到源类型“Microsoft.AnalysisServices.AdomdClient.CellSet”的查询模式的实现。未找到“选择”。

更新

我已经尝试过 Enrico 的建议,到目前为止它没有返回任何错误。下一个问题是如何从单元格中读取值。这是我到目前为止所尝试的:

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)
     };
4

1 回答 1

2

您收到该错误的原因是CellSet类本身没有实现IEnumerable<T>,这是 LINQ 所要求的。

请尝试对CellSet.Cells属性执行 LINQ 查询。这将返回一个实现IEnumerable的CellCollection对象。从那里,您可以使用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
             { ... };

也可以看看:

于 2012-01-31T08:50:25.947 回答