EF4 в набор данных? И другое безумие сводной таблицы


Короткий вопрос: Как я могу обрабатывать сводную таблицу в EF4? Любые предложения, отличные от "pivot client-side", будут считаться полезными.

Одна из идей заключается в том, чтобы напрямую запросить базу данных и поместить результаты в набор данных. Это не очень джентльменское решение. Моя единственная другая идея-использовать какую-то магию отражения, чтобы динамически создавать свойства для временного объекта. Я понятия не имею, как справиться с этим в представлении.

Вот более подробное объяснение и что угодно:

В моем приложении есть оборудование. Он позволяет пользователю "претендовать" на часть оборудования, а затем установить статус для этой части оборудования.

Соответствующая структура таблицы выглядит следующим образом:

    EquipmentId, EquipmentName, etc
    ClaimId, StatusChangeId, EquipmentId, UserId
    StatusChangeId, StatusId, etc
    StatusId, StatusName, etc

Мой запрос ищет все соответствующие утверждения для пользователя (не удалены или архивированные или новые, только со статусами), получает последний статус для каждого из них, подсчитывает их, а затем связывает их с соответствующим оборудованием.

Эта большая задница динамична запрос сводит данные для создания результирующего набора, например:

equipment name    Total    Status1  Status2  Status 3
Computer            4         0        3        1
Monitor             6         1        5        0

Проблема в том...как мне справиться с этим в EF4? Здесь нет чистое решение, очевидно, потому что статусы являются динамическими и возвращаются как столбцы. Что означает, что объект должен был бы магически создать свойства на лету. Статусы, скорее всего, не изменятся в ближайшие несколько недель, так как промежуточное решение я принудительно скормил ему объект со статусами жестко закодированный. Но это ужасно некрасиво и отчасти нарушает цель. из моих динамические столбцы и, ну, вся таблица состояния.

Моя единственная другая идея-взять и разделить мой прекрасный новый запрос, который требуется меньше секунды, чтобы запустить против 1000 + записей в крошечный маленький запрос, который получает статусы и считается за один кусок оборудование за раз и складывает все это вместе в код.

Для пользователей, которые имеют несколько сотен различных типов оборудования, это будет означать несколько сотен поездок в базу данных. И у меня есть 2 других запроса, основанных на этом тот, который выходит и захватывает информацию об оборудовании для пользователей, связанных с базой user...so если есть пользователь с парой сотен типов оборудования, и он связан с двумя другими пользователями, у которых есть 70 типов оборудования каждый, и у них есть пользователи, связанные...вы получите картину.

Edit

Мне приходит в голову, что потенциально это можно решить, поместив столбцы в список простого объекта со статусом Name и Count как часть a Объект EquipmentStatus. К сожалению, я до сих пор не знаю, как это сделать. Хотя Microsoft признает, что обработка пивотов-это проблема, их официальное слово - "мы не знаем, когда это произойдет".

EDIT 2

Как только у меня будет время, я опубликую свое окончательное решение. Мы наконец-то приступим к производству на этой неделе, так что это может занять несколько дней. Извините всех, кто приходит сюда в поисках ответа.

1 2

1 ответ:

EF не может обрабатывать такие динамические запросы - EF сильно типизирован, поэтому вам нужно иметь по крайней мере тип (класс), имеющий свойства с тем же именем, что и столбцы в результирующем наборе. Этот тип можно использовать для материализации записей из результирующего набора.

Итак, как использовать этот подход с динамическим набором результатов? Для получения имен столбцов, используемых в реальном запросе, потребуется что-то вроде запроса к базе данных, используя Reflection.Emit для создания динамической сборки с динамическим типом (новый для каждого запрос с другим результирующим набором) и использовать его каким-то динамическим способом (возможно, путем рефлексии).

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

DataSet, DataAdapter и DbCommand - классы для запросов с динамическими результирующими наборами. Чем эти классы хуже решения с созданием сборок во время выполнения? DataSet позволит вам реализовать это за несколько минут!