Нужна помощь в преобразовании запроса Linq (Silverlight RIA Entity - Oracle DB) - PullRequest
0 голосов
/ 13 мая 2011

У меня нет проблем с SQL, но я нахожу Linq немного запутанным.C #, .NET4, Silverlight, службы RIA, Oracle DB (v?), VS2010 с запущенным Devart dotConnect 6.10.121.

У меня есть объект RIA

public sealed partial class ProcessLogHdr : Entity
{
    DateTime JobDate;
    string InterfaceName;
    int SuccessfulCount;
    int FailCount;
    int TotalCount;
}

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

Я буду вызывать context.Load для запроса, где я передаю дату начала и окончания, которая вOracle выглядит следующим образом:

select
    trunc(JobDate),
    InterfaceName,
    sum(SuccessfulCount) as Total_Pass,
    sum(FailCount) as Total_Fail,
    sum(TotalCount) as Total,
    max(JobDate) as Last_Msg_Processed_At_DT
from
    ProcessLogHdrsEntity
where
    JobDate >= START_DATE_IN_VAR and
    JobDate <= END_DATE_IN_VAR
group by
    trunc(JobDate),
    InterfaceName
order by 
    trunc(JobDate) desc,
    InterfaceName asc;

conttext.Load вызовет запрос linq из метода, который возвращает IQueryable.Оператор linq должен выполняться для Oracle под Devart dotConnect для Oracle.Я предполагаю, что мне нужен какой-то пользовательский класс для хранения результатов, например ProcessLogHdrDateSummary.

Если вы, ребята, могли бы помочь мне заполнить недостающие ?????linq, я был бы очень благодарен:

public IQueryable<ProcessLogHdrDateSummary> GetProcessLogHdrsDateSummary(DateTime START_DATE_IN_VAR, DateTime END_DATE_IN_VAR)
{
    return ?????
}

Большое спасибо!

Ответы [ 2 ]

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

Запрос LINQ будет довольно сложным. Я рекомендую вам выполнить следующие действия:
1. Создайте хранимую процедуру с помощью курсора out:

CREATE PROCEDURE myQuery(
  DATE START_DATE_IN_VAR, 
  DATE END_DATE_IN_VAR, 
  cur out sys_refcursor) AS  
BEGIN  
  OPEN cur FOR SELECT  
    trunc(JobDate),  
    InterfaceName,  
    sum(SuccessfulCount) as Total_Pass,  
    sum(FailCount) as Total_Fail,  
    sum(TotalCount) as Total,  
    max(JobDate) as Last_Msg_Processed_At_DT  
  from  
    ProcessLogHdrsEntity  
  where  
    JobDate >= START_DATE_IN_VAR and JobDate <= END_DATE_IN_VAR
  group by
    trunc(JobDate), InterfaceName  
  order by 
    trunc(JobDate) desc, InterfaceName asc;  
END;  

2. Добавьте эту процедуру к модели. Если вы используете модель Devart Entity, тип возвращаемого значения, вероятно, будет сгенерирован. В другом случае вам нужно будет создать сущность или сложный тип, который будет представлять тип возвращаемого значения сгенерированного метода.

3. Обработайте вызов метода как обычный метод DomainService.

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

Нет простого ответа на это.Одной из характеристик LINQ для поставщиков баз данных является то, что некоторые запросы выполняются немедленно, а другие - нет.Функции агрегирования (MAX, MIN и т. Д.) Возвращаются немедленно.То же самое делают некоторые функции LINQ, которые определяют конкретный вывод, такой как .First ().Все, что возвращает коллекцию, скорее всего, не выполнится немедленно и вернет IQueryable <> некоторого типа.

Какого типа?Это зависит от того, что указывает предложение select оператора LINQ (что не совпадает с сгенерированным предложением выбора SQL).«from c в db.customers select c» возвращает объекты клиентов, но вы также можете использовать предложение select для заполнения других классов или анонимных классов.

Если запрос LINQ возвращает IQueryable <>, помните, чтозапрос еще не выполнен!Он не будет выполняться, пока вы не начнете обрабатывать данные.Вы должны обрабатывать данные, находясь в области контекста данных, потому что после того, как это исчезло, вы потеряли соединение с базой данных.

Вы всегда можете принудительно выполнить IQueryable <>, заканчивая его .ToList (), .ToArray (), .ToDictionary () или несколько других.List <> будет использовать тот же универсальный тип, что и IQueryable <> и предложение select (или метод .Select ()) оператора LINQ.

...