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()
方法的方法,我想这是不可能的。
- 有一个
Then(object)
,这将是你的查询回落到和EntitySpaces被转换为字符串文字,直接将进入最终的查询。 - 有一个
Then(esQueryItem)
它可以与单列如qryGl.Source
一起使用。 - 最后有一个
Then(esExpression)
。我对这个有点模糊,但我相信它被用来容纳选择的语句参数,所以它可能也不适合你。
我想你会需要的是一个Then(DynamicQuery)
或类似的东西。
由于EntitySpaces现在是开源的,您可以自己添加该过载,然后修改用于使用新的子查询选项的数据提供程序。我已经做了类似的改变来处理其他地方的子查询,并且它并不是真的太糟糕了。最简单的部分实际上是提供者,因为一旦你确定你正在处理子查询,你基本上只需要在新的嵌入式查询中再次调用堆栈顶部,然后继续。
但是,从我上面看到的,我会说如果你想避免在EntitySpaces代码中混淆,你可能需要回退到硬编码查询。来自EntitySpaces的Mike总是建议使用数据库视图或存储过程来进行自定义加载。
此外:请记住,如果您在客户端创建手动查询,您仍然可以避免使用[TableName] Metadata.ColumnNames [ColumnNameConstant]对大部分查询进行硬编码。
谢谢@JoelC。为了让它工作起来,我确实必须对SQL进行硬编码(截止日期!)我想说我会按照您的建议来看看源代码,但实际上我怀疑我会找时间! 是的,谢谢,我尽可能使用元数据。 – brad 2014-12-08 05:10:52