我正在尝试使用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来说很新,所以希望它只是我想念的简单......
干杯
答案 0 :(得分:0)
查看Then()
方法的可用方法,我认为这可能是不可能的。
Then(object)
,这将是您的查询所依赖的内容,EntitySpaces正在转换为字符串文字并直接放入最终查询。Then(esQueryItem)
可用于qryGl.Source
等单个列。Then(esExpression)
。我对这个有点模糊,但我相信它用于存放select语句参数,所以它可能对你不起作用。我认为您需要的是Then(DynamicQuery)
或类似的东西。
由于EntitySpaces现在是开源的,您可以自己添加该重载,然后修改用于处理新子查询选项的数据提供程序。我已经做了类似的更改来处理其他地方的子查询,这对任务来说并不是太糟糕。最简单的部分实际上是提供者,因为一旦确定您正在处理子查询,您基本上只需再次为新嵌入式查询调用堆栈顶部,然后再继续。
但是,从我上面看到的情况来看,我会说如果你想避免在EntitySpaces代码中捣乱,你可能需要回到硬编码查询。来自EntitySpaces的Mike总是为这样的自定义加载推荐数据库视图或存储过程。
另外:请记住,如果您在客户端创建手动查询,您仍然可以使用[TableName] Metadata.ColumnNames避免对大部分查询进行硬编码。[ColumnNameConstant]。