EntitySpaces/C#:如何在CASE语句中使用子查询?

EntitySpaces/C#:如何在CASE语句中使用子查询?

问题描述:

我想模拟一个使用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,所以希望它只是一些简单的我已经错过了......

干杯

综观可用于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