Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntitySpaces/C:如何在CASE语句中使用子查询?_C#_Subquery_Case_Entityspaces - Fatal编程技术网

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

C# EntitySpaces/C:如何在CASE语句中使用子查询?,c#,subquery,case,entityspaces,C#,Subquery,Case,Entityspaces,我正在尝试使用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

我正在尝试使用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来说很陌生,所以希望这只是我错过的一些简单的东西


干杯

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

有一个Thenobject,它将是您的查询返回的对象,EntitySpaces将转换为字符串文本并直接放入最终查询中。 有一个ThenesQueryItem,它可以处理单个列,例如qryGl.Source。 最后是ThenesExpression。我对这一点有点模糊,但我相信它是用来存放select语句参数的,所以它可能对您也不起作用。 我想你需要的是一个动态查询或类似的东西

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

然而,从上面我看到的情况来看,如果您想避免在EntitySpaces代码中捣乱,您可能需要返回到硬编码查询。EntitySpaces的Mike总是建议对这样的自定义加载使用数据库视图或存储过程


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

谢谢@JoelC。我最终不得不硬编码SQL,只是为了让它在最后期限内工作!我想说的是,我会像你推荐的那样查看源代码,但实际上我怀疑我是否能找到时间!是的,谢谢,我尽可能使用元数据。