Как я могу кодировать многочисленные функции MIN в один запрос LINQ to DataSet - PullRequest
2 голосов
/ 03 мая 2011

Хорошо, я работал над этим некоторое время, прежде чем просить о помощи. У меня есть 4 запроса SQL на основе Oracle, которые следуют друг за другом для доставки запрошенных данных. Я работаю в .NET и думаю (надеюсь), что мог бы использовать LINQ to DataSet для передачи первого запроса второму, который переходит к третьему и, наконец, к четвертому. Моя головная боль связана с переходом от первого ко второму. Я могу получить первый запрос в DataSet с помощью обычных запросов ODP.NET и C #.

Вот шаг 2

SELECT eid,
num_1,
MIN(cdts) keep (dense_rank FIRST ORDER BY eid) first_creation,
cpers,
curent,
ag_id,
beat,
group_priority,
disp_date,
MIN(disp_time) keep (dense_rank FIRST ORDER BY eid) first_call,
curent_16,
MIN(ad_sec) keep (dense_rank FIRST ORDER BY eid) first_entry,
MIN(ds_sec) keep (dense_rank FIRST ORDER BY eid) first_dispatched,
MIN(ar_sec) keep (dense_rank FIRST ORDER BY eid) first_arrival,
MIN(csec) keep (dense_rank FIRST ORDER BY unid) fastest_unit,
MIN(hold_sec) keep (dense_rank FIRST ORDER BY eid) fastest_dispatch,
MIN(drive_sec) keep (dense_rank FIRST ORDER BY unid) fastest_enroute,
MIN(resp_sec) keep (dense_rank FIRST ORDER BY unid) fastest_arrival,
unid FROM JC5A_STEP1 GROUP BY eid,
num_1,
cpers,
curent,
ag_id,
beat,
group_priority,
disp_date,
curent_16,
unid HAVING cpers <> 0 AND curent = 'T' AND curent_16 ='T' ORDER BY eid;

Я пытался написать LINQ to DataSet, который заполнил бы его в собственный DataSet. Это то, что я имею до сих пор, и я знаю, что я далеко

var query2 = (from row in query1.AsEnumerable() where row.Field<int32>("cpers") != 0 && row.Field<string>("curent") == "T" && row.Field<string>("curent_16") == "T" order by row.Field<Int32>("eid") select new { eid = row.Field<Int32>("eid"), ... }).Min(x => x.cdts); 

Я опустил все не минимальные поля и поле, которое включено для краткости. Итак, мой вопрос: могу ли я написать запрос LINQ to DataSet, который будет включать в себя то, что у меня есть в операторе SELECT, и если да, то где я сошел с рельсов? Если нет, то нужно ли мне разрабатывать все это в функциях PL / SQL и вызывать их из приложения как хранимые процедуры?

Спасибо всем за помощь,

Т.

Исходя из быстрой обратной связи, первый запрос здесь:

select a.eid, a.num_1, e.cdts, e.cpers, a.curent, a.tycod, a.ag_id, a.lev3 as beat, case when a.priority < '2' then 'high' when a.priority > '2' then 'low' else 'normal' end as group_priority, substr(e.cdts,5,2)||'/'||substr(e.cdts,7,2)||'/'||substr(e.cdts,1,4) as disp_date, substr(e.cdts,9,6) as disp_time, e.curent AS curent_16, a.ad_sec, a.ds_sec, a.ar_sec, u.csec, a.ds_sec - a.ad_sec as hold_sec, u.csec - a.ds_sec as drive_sec, u.csec - a.ad_sec as resp_sec, a.priority, u.unid from un_hi u join (aeven a join event e on a.eid = e.eid) on u.eid = a.eid where e.cdts between '20110101' and '20110201' and a.tycod not in ('ANIMAL', 'BUSINESS', 'CARCHECK', 'CARSTAT', 'CIVSERV', 'CKLIGHTS', 'COURT', 'ERRAND', 'FOLLOW', 'FOOTPURS', 'GREATMAL', 'HOUSE', 'INFO', 'K9', 'PEDCHECK', 'PRISONER', 'RESIDENC', 'SELF', 'SPECIAL', 'STATION', 'TELEPHON', 'TRAFFIC', 'TRASH', 'WARRANT', 'WEATHER') and u.unit_status = 'AR' and a.ag_id = 'JCSO' and a.lev3 = 'JC5' and a.ar_sec is not null and a.ds_sec is not null and a.ds_sec - a.ad_sec between 1 and 7200 and a.ar_sec - a.ds_sec between 1 and 18000 and a.ar_sec - a.ad_sec between 1 and 18000 and u.csec - a.ds_sec > 1 and u.csec - a.ad_sec > 2 order by e.cpers, a.eid, u.csec;

1 Ответ

0 голосов
/ 04 мая 2011

Я бы хотел использовать linq to sql для решения вашей проблемы вместо linq to datasets.Вместо того, чтобы писать свой запрос в sql, вы можете сделать это, используя c # напрямую, что может предоставить вам больше возможностей (пользовательских объектов) без ограничений и головной боли при работе с DataSet и друзьями.

...