2014-10-01 82 views
1

我想模擬一個使用EntitySpaces的SQL代碼片段。我正要準備回退到好醇」原始SQL,但寧願學習如何正確地做到這一點...EntitySpaces/C#:如何在CASE語句中使用子查詢?

這是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,所以希望它只是一些簡單的我已經錯過了......

乾杯

回答

0

綜觀可用於Then()方法的方法,我想這是不可能的。

  1. 有一個Then(object),這將是你的查詢回落到和EntitySpaces被轉換爲字符串文字,直接將進入最終的查詢。
  2. 有一個Then(esQueryItem)它可以與單列如qryGl.Source一起使用。
  3. 最後有一個Then(esExpression)。我對這個有點模糊,但我相信它被用來容納選擇的語句參數,所以它可能也不適合你。

我想你會需要的是一個Then(DynamicQuery)或類似的東西。

由於EntitySpaces現在是開源的,您可以自己添加該過載,然後修改用於使用新的子查詢選項的數據提供程序。我已經做了類似的改變來處理其他地方的子查詢,並且它並不是真的太糟糕了。最簡單的部分實際上是提供者,因爲一旦你確定你正在處理子查詢,你基本上只需要在新的嵌入式查詢中再次調用堆棧頂部,然後繼續。

但是,從我上面看到的,我會說如果你想避免在EntitySpaces代碼中混淆,你可能需要回退到硬編碼查詢。來自EntitySpaces的Mike總是建議使用數據庫視圖或存儲過程來進行自定義加載。

此外:請記住,如果您在客戶端創建手動查詢,您仍然可以避免使用[TableName] Metadata.ColumnNames [ColumnNameConstant]對大部分查詢進行硬編碼。

+0

謝謝@JoelC。爲了讓它工作起來,我確實必須對SQL進行硬編碼(截止日期!)我想說我會按照您的建議來看看源代碼,但實際上我懷疑我會找時間! 是的,謝謝,我儘可能使用元數據。 – brad 2014-12-08 05:10:52