1

我正在尝试使用 EntitySpaces 模拟一段 SQL。我正准备回退到好的 ol' 原始 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 回答