过去几周,我一直在将一个用 VB 编写的程序转换为 C#。 在某些地方,我注意到以一种奇怪的方式编写的查询,出现了“Shape”和“Append”这两个词。 例如:
SHAPE {SELECT Test, IdQuestion, QuestionName, QuestionTimeLimit, ImageLocation
FROM dbo.userViewConTestQues
WHERE (Test = 5) ORDER BY QuestionOrder} AS ParentCMD APPEND ({SELECT Answer,
IdAnswer, Question FROM dbo.userAnswers } AS ChildCMD RELATE IdQuestion TO Question) AS ChildCMD
我完全确定该查询的等效项是 INNER JOIN,类似于:
SELECT A.Test, A.IdQuestion, A.QuestionName, A.QuestionTimeLimit, A.ImageLocation,
B.Answer, B.IdAnswer FROM dbo.userViewConTestQues A INNER JOIN
dbo.userAnswers B ON A.IdQuestion=B.Question WHERE A.Test=5 ORDER BY A.QuestionOrder
调试后得到如下结果: 旧程序的记录数是 60,这意味着 60 行,而运行我编写的新查询时得到了 400 多行,所以我想我错了。 现在的“形状 - 追加”等价物是什么?
编辑: 60 行只属于父记录集,但是 child 的记录集数是 6,但我不知道如何获取它们。
最佳答案
如果我没记错的话,SHAPE APPEND 关联父子数据,结果是您实际上为每个父行获得一个子记录集。使用结果时,您必须检查该记录集并适本地处理它(如果网格不支持它)。
当你说 60 行时,你是否可能只计算父记录集?
即使子记录集中没有行,它也会为您提供父记录集中的记录,因此它更像是 LEFT OUTER JOIN
但实际上并没有直接的 SQL 等价物这将为您提供 SHAPE APPEND 所做的分层结果。
如果您想继续使用 SHAPE APPEND,OleDbConnection 和 OleDbDataAdapter 仍然支持该语法,但您必须将 Provider=MSDataShape
添加到您的连接字符串。然后在获取行时,您将在父级 DataRow
上使用 GetChildRows()
来获取子行。
关于c# - 如今“形状 - 追加”查询等效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957377/