0

SQL には問題はありませんが、Linq は少しわかりにくいと思います。C#、.NET4、Silverlight、RIA サービス、Oracle DB (v?)、Devart dotConnect 6.10.121 を実行する VS2010。

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 は、IQueryable を返すメソッドから linq クエリを呼び出します。linq ステートメントは、Devart dotConnect for Oracle の下で Oracle に対して実行する必要があります。ProcessLogHdrDateSummary のように、結果を保持するためのカスタム クラスが必要だと思います。

不足している部分を埋めるのを手伝っていただければ????? linq、私はとても感謝しています:

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

どうもありがとう!

4

2 に答える 2

0

これに対する簡単な答えはありません。データベースプロバイダーに対するLINQの特徴の1つは、一部のクエリがすぐに実行されるのに対し、他のクエリは実行されないことです。集計関数(MAX、MINなど)はすぐに戻ります。したがって、.First()などの特定の出力を指定するいくつかのLINQ関数を実行します。コレクションを返すものはすぐには実行されない可能性が高く、何らかのタイプのIQueryable<>を返します。

どんなタイプ?これは、LINQステートメントのselect句で指定されている内容によって異なります(生成されたSQL select句とは異なります)。「fromcindb.customers select c」は顧客オブジェクトを返しますが、select句を使用して、他のクラスまたは匿名クラスにデータを取り込むこともできます。

LINQクエリがIQueryable<>を返す場合は、クエリがまだ実行されていないことに注意してください。データの処理を開始するまで実行されません。データコンテキストのスコープ内にある間にデータを処理する必要があります。これがなくなると、データベース接続が失われるためです。

.ToList()、. ToArray()、. ToDictionary()、またはその他のいくつかで終了することにより、いつでもIQueryable<>を強制的に実行できます。List <>は、IQueryable <>およびLINQステートメントのselect句(または.Select()メソッド)と同じジェネリック型を使用します。

于 2011-05-13T00:33:31.360 に答える
0

LINQ クエリはかなり複雑になります。次の手順に従うことをお勧めします。
1. アウト カーソルを使用してストアド プロシージャを作成します。

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 メソッドとして扱います。

于 2011-05-13T12:53:47.650 に答える