Чтение из CellSet с использованием LINQ - PullRequest
2 голосов
/ 31 января 2012
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. «Выбрать» не найдено.

ОБНОВЛЕНИЕ :

Я попробовал предложение Энрико, и пока оно не возвращает никаких ошибок. Следующая проблема заключается в том, как прочитать значение из ячейки. Вот что я пробовал до сих пор:

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 Ответ

2 голосов
/ 31 января 2012

Причина, по которой вы получаете эту ошибку, заключается в том, что класс CellSet сам по себе не реализует IEnumerable , что требуется для LINQ.

Попробуйтевместо этого выполнить запрос LINQ над свойством CellSet.Cells .Это вернет объект CellCollection , который реализует IEnumerable .Оттуда вы можете легко преобразовать его в IEnumerable , используя метод Enumerable.Cast .

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

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

См. Также:

...