Кроме простого маппинга объектов на фиксированные таблицы-поля пока из BLT ничего не использовал. Теперь нужно извлечь данные в такой ситуации:
1. имя вьюшки (View1, View2, View3 ...) становится известно перед извлечением данных
2. одна колонка — DateTime TIME_STAMP — всегда есть, а вторая может иметь разные имена и разный тип (int,float,bit)
Как правильнее использовать BLT для упрощения кодирования извлечения данных?
Здравствуйте, Odi$$ey, Вы писали:
OE>Кроме простого маппинга объектов на фиксированные таблицы-поля пока из BLT ничего не использовал. Теперь нужно извлечь данные в такой ситуации: OE>1. имя вьюшки (View1, View2, View3 ...) становится известно перед извлечением данных OE>2. одна колонка — DateTime TIME_STAMP — всегда есть, а вторая может иметь разные имена и разный тип (int,float,bit) OE>Как правильнее использовать BLT для упрощения кодирования извлечения данных?
1. см SqlQuery и его родителей. Это как вариант генерации запросов. Имя вьюшек можно попробовать шаманить через свой MetaDataProvider. Имя второй колонки сокорее всего тоже можно через генерацию подшаманить через AS.
2. Тип данных — не особо важен, если есть более обобщенный тип к которому можно привести все эти типы. Допустим тот же float — в него BLT из приведенных выше сконвертит.
В общем я бы сделал генератор запросов для таких вьюшек и итоговый тип который из нее выбирается. А если тип не нужен, то всегда можно выбирать и DataTable...
P.S. есть еще один шаманский способ, сделать маппинг ручками — для этого свой объект надо унаследовать от ISupportMapping, или повесить на геро фабрику объектов.
Здравствуйте, ili, Вы писали:
ili> Имя второй колонки сокорее всего тоже можно через генерацию подшаманить через AS.
или еще можно сделать для объекта свой ObjectMapper, перегрузить в нем GetOrdinal(string name) и на все имена отличные от "DateTime" вертать ординал от "SecondField"
Здравствуйте, ili, Вы писали:
ili>или еще можно сделать для объекта свой ObjectMapper, перегрузить в нем GetOrdinal(string name) и на все имена отличные от "DateTime" вертать ординал от "SecondField"
с SqlQuery вроде все просто решается, можно параметрами сформатировать, типа-
[SqlQuery(@"SELECT TIME_STAMP, {1} FROM {0}
WHERE TIME_STAMP >= @from AND TIME_STAMP <= @to
ORDER BY TIME_STAMP")]
public abstract _______ GetDataHistory([Format(0)]string viewName, [Format(1)]string fieldName, DateTime from, DateTime to);
а вот насчет возвращаемого значения — нельзя ли получить IEnumerable<> объектов анонимного типа, сделанного на основе полей, перечисленных в запросе, как это например linq-овский Select делает?
(по исходникам я шарюсь, но может кто навскиду ткнет в нужное место)
Здравствуйте, Odi$$ey, Вы писали:
OE>а вот насчет возвращаемого значения — нельзя ли получить IEnumerable<> объектов анонимного типа, сделанного на основе полей, перечисленных в запросе, как это например linq-овский Select делает?
а как ты потом будешь обращаться к полям этих типов? да и:
Анонимный тип имеет область действия метода. Для передачи анонимного типа или коллекции анонимных типов за границы метода необходимо прежде всего привести тип к объекту. Однако это нарушает строгое определение анонимного типа. Если результаты запроса нужно сохранить или передать за границы метода, попробуйте воспользоваться обычной именованной структурой или классом вместо анонимного типа.
можно попробовать что-то типа IEnumerable<DataRow>... но я бы сварганил простой тип с обджек маппер к нему.. хотя, это к вопросу о том на сколько тебе важено сохранить оригинальный тип второго поля...
Здравствуйте, ili, Вы писали:
OE>>а вот насчет возвращаемого значения — нельзя ли получить IEnumerable<> объектов анонимного типа, сделанного на основе полей, перечисленных в запросе, как это например linq-овский Select делает? ili>а как ты потом будешь обращаться к полям этих типов?
по именам, через Reflection
ili>Анонимный тип имеет область действия метода
не особо критично, я могу вывести результат (на экран) прямо в этом методе и больше он мне не нужен
ili>на сколько тебе важено сохранить оригинальный тип второго поля...
оригинальный тип не важен, значения нужны только для вывода на экран, но я похоже не совсем точно описал начальные условия — "вторых" параметров может быть как один так и несколько
Здравствуйте, Odi$$ey, Вы писали:
ili>>Анонимный тип имеет область действия метода OE>не особо критично, я могу вывести результат (на экран) прямо в этом методе и больше он мне не нужен
на сколько я понимаю, в этом случае анонимный тип определился бы не в твоем методе, а в потрохах BLT, в то время как в Linq2Object он определяется в методе где и пользуется. может Linq провайдер и умеет такое делать, но без него вроде как тут фиг что сделаешь.
OE>оригинальный тип не важен, значения нужны только для вывода на экран, но я похоже не совсем точно описал начальные условия — "вторых" параметров может быть как один так и несколько
да верни ты DataTable\ IEnumerable<DataRow> в таком случае и не мучайся может еще можно что-то типа List<List<string>> — но такого я никогда не проверял