首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntitySpace/C#:如何在CASE语句中使用子查询?

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

Stack Overflow用户
提问于 2014-10-01 02:52:37
回答 1查看 832关注 0票数 1

我正在尝试使用EntitySpaces来模拟SQL的一个片段。我正准备回到好的原始SQL,但更愿意学习如何正确地做到这一点.

这就是我试图复制的SQL:

代码语言:javascript
复制
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

我一直在玩代码,但没有运气。这就是我现在得到的:

代码语言:javascript
复制
    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);

这给了我以下(显然是错的!)产出:

代码语言:javascript
复制
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来说很新,所以希望这只是我错过的一些简单的东西.

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-05 21:01:23

看看Then()方法可用的方法,我认为这可能是不可能的。

  1. 有一个Then(object),这将是您的查询返回的内容,EntitySpaces正在将其转换为字符串文本并直接放置到最终的查询中。
  2. 有一个Then(esQueryItem),它可以处理单个列,比如qryGl.Source
  3. 最后是一个Then(esExpression)。我在这个问题上有点模糊,但我相信它是用来容纳select语句参数的,所以它可能也不适用于您。

我认为您需要的是一个Then(DynamicQuery)或类似的东西。

由于EntitySpaces现在是开源的,所以您可以自己添加重载,然后修改用于使用新的子查询选项的数据提供程序。我也做了一个类似的修改来处理其他地方的子查询,这并不是一个很糟糕的任务。最简单的部分实际上是提供程序,因为一旦确定您正在处理子查询,您基本上只需再次调用堆栈的顶部,然后再继续进行新的嵌入式查询。

但是,根据我在上面所看到的,如果您想避免在EntitySpaces代码中胡闹,您可能需要回到硬编码的查询。EntitySpaces的Mike总是建议使用数据库视图或存储过程来处理这样的自定义加载。

另外:请记住,如果在客户端创建手动查询,仍然可以通过使用TableNameMetadata.ColumnNames.ColumnNameConstant.避免对大部分查询进行硬编码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26133394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档