1

EntitySpaces を使用して SQL のスニペットをエミュレートしようとしています。古き良き生のSQLにフォールバックする準備ができていますが、これを適切に行う方法を学びたいです...

これは私が再現しようとしているSQLです:

SELECT 
    CASE WHEN GL.SOURCE = 'AP' THEN (SELECT COMPANY FROM VEND WHERE VEND.ID = GL.ID)
        WHEN GL.SOURCE = 'AR' THEN (SELECT COMPANY FROM CUST WHERE CUST.ID = GL.ID)
        WHEN GL.SOURCE = 'SB' THEN (SELECT COMPANY FROM SBMASTER WHERE SBMASTER.ID = GL.ID)
        ELSE '' END AS COMPANY
FROM GL
    LEFT OUTER JOIN ACCT ON GL.ACCT = ACCT.ACCT

私は運が悪いので、コードを少しいじっています。これは私が現時点で持っているものです:

    GlQuery qryGl = new GlQuery("qryGl");
    AcctQuery qryAcct = new AcctQuery("qryAcct");
    AcctQuery qryAcctSub = new AcctQuery("qryAcct");
    VendQuery qryVendSub = new VendQuery("qryVend");
    CustQuery qryCustSub = new CustQuery("qryCust");
    SbmasterQuery qrySbmasterSub = new SbmasterQuery("qrySbmaster");

    qryGl.Select
    (
        qryGl.Source.Case()
            .When("AP").Then(qryVendSub.Select(qryVendSub.Company).Where(qryVendSub.Id == qryGl.Id))
            .When("AR").Then(qryCustSub.Select(qryCustSub.Company).Where(qryCustSub.Id == qryGl.Id))
            .When("SB").Then(qrySbmasterSub.Select(qrySbmasterSub.Company).Where(qrySbmasterSub.Id == qryGl.Id))
            .Else("")
            .End().As("COMPANY")
    );
    qryGl.LeftJoin(qryAcct).On(qryGl.Acct == qryAcct.Acct);

これにより、次の(明らかに間違っています!)出力が得られます。

SELECT 
    [COMPANY] = CASE  
        WHEN 'AP' THEN MyProject.Com.Data.VendQuery 
        WHEN 'AR' THEN MyProject.Com.Data.CustQuery 
        WHEN 'SB' THEN MyProject.Com.Data.SbmasterQuery 
        ELSE '' 
    END   
FROM [GL] qryGl 
    LEFT JOIN [ACCT] qryAcct ON qryGl.[ACCT] = qryAcct.[ACCT]

そのサブクエリ SQL を case ステートメントに入れるための助けをいただければ幸いです!!

EntitySpaces はかなり新しいので、見逃した単純なものであることを願っています...

乾杯

4

1 に答える 1

0

メソッドに利用可能なメソッドを見てThen()、私はそれが不可能かもしれないと思っています。

  1. がありThen(object)、クエリがフォールバックし、EntitySpaces が文字列リテラルに変換され、最終的なクエリに直接配置されます。
  2. Then(esQueryItem)のような単一の列で機能する がありますqryGl.Source
  3. 最後に がありThen(esExpression)ます。私はこれについて少し霧がかかっていますが、選択ステートメントのパラメーターを格納するために使用されていると思うので、おそらくうまくいかないでしょう。

Then(DynamicQuery)あなたが必要とするのは、またはそれに似たものだと思います。

EntitySpaces はオープン ソースになったため、そのオーバーロードを自分で追加してから、新しいサブクエリ オプションを操作するために使用するデータ プロバイダーを変更できます。他の場所でサブクエリを処理するために同様の変更を行いましたが、それほど悪い作業ではありませんでした。最も簡単な部分は実際にはプロバイダーです。サブクエリを扱っていると判断したら、基本的に、新しい埋め込みクエリに対してスタックのトップを再度呼び出すだけで続行できるからです。

ただし、上記の内容から、EntitySpaces コードをいじるのを避けたい場合は、おそらくハードコーディングされたクエリにフォールバックする必要があると言えます。EntitySpaces の Mike は、カスタム ロードのようなデータベース ビューまたはストアド プロシージャを常に推奨していました。

また、クライアント側で手動クエリを作成する場合でも、[TableName]Metadata.ColumnNames.[ColumnNameConstant] を使用することで、クエリの大部分をハード コーディングすることを回避できることに注意してください。

于 2014-12-05T21:01:23.373 に答える