【发布时间】:2021-12-29 06:28:08
【问题描述】:
我有一个想通过 C# 应用程序运行的查询。在应用程序之外没有执行此操作的选项。我有以下代码:
var keyGroupsToCleanUp = new List<string>
{
"Address",
"Manufacturer",
"Product",
"Customer",
"Picture",
"Category",
"Vendor",
"SS_A_Attachment",
"SS_A_AttachmentDownload",
"SS_MAP_EntityMapping",
"SS_MAP_EntityWidgetMapping",
};
foreach (var keyGroup in keyGroupsToCleanUp)
{
_databaseFacade.ExecuteSqlCommand($@"
DELETE
FROM GenericAttribute
WHERE KeyGroup = {keyGroup} AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM [{keyGroup}]);
");
}
我想遍历列表中的每个名称并为每个名称运行以下查询。当我尝试这样做时,我收到以下错误:
System.Data.SqlClient.SqlException (0x80131904): Invalid object name '@p1'.
从网上查到的,这是因为表名不能是字符串。您必须声明一个变量并将此变量用作表名。我了解到一个 Table 变量有需要声明的列,我感到一阵恐惧冲刷着我。这些表都没有相同的列结构。
我正在尝试做的事情可能吗?如果是这样,我该怎么做?
GenericAttributes 表是一个包含六列的大表。
当我加入正在使用它的项目时,它已经被使用到无法替代的地步。通过将 KeyGroup 指定为数据库表,您可以在此处保存数据库表的其他数据。我们有一个名为“地址”的表,我们在 GenericAttributes 表中为地址保存了额外的数据(我知道这没有意义)。这会导致很多问题,因为关系数据库不适用于此。我在上面编写的查询在 GenericAttributes 表中查找现在已分离的行。例如,EntityId 0 在 Address 中不作为 Id 存在,因此将在此处返回。然后必须删除该行,因为它链接到一个不存在的 entityId。
这是一个可以实现这一目标的查询示例:
// Address
_databaseFacade.ExecuteSqlCommand(@"
DELETE
FROM GenericAttribute
WHERE KeyGroup = 'Address' AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM [Address]);
");
我必须为 11 个表执行此操作,所以我想让它更容易执行。每个查询都以相同的方式编写。唯一改变的是 KeyGroup 和它要查找的表。它们都将始终具有相同的名称。
这是另一个产品调用的示例。它们是相同的,唯一的区别是NOT IN语句中的KeyGroup和Table。
// Product
_databaseFacade.ExecuteSqlCommand(@"
DELETE
FROM GenericAttribute
WHERE KeyGroup = 'Product' AND [Key] = 'CommonId'
AND EntityId NOT IN (SELECT Id FROM Product);
");
【问题讨论】:
-
我理解你的问题。当我在 SSMS 中输入 SQL 命令时,它会起作用。这是一个用于 NopCommerce 框架中的表概念的查询。它被称为 GenericAttributes 表,我希望我从未见过它。你可以在这里阅读更多信息:docs.nopcommerce.com/en/developer/tutorials/db-schema.html
-
@Charlieface 你能举个例子来说明如何做到这一点,还是根本不可能?
-
@Charlieface 好的,谢谢你的帮助。
-
我已经更新了解释我为什么要这样做的问题。我希望这对你有意义。在我来到这里之前,项目开发人员严重滥用了这个问题的表格。
标签: c# sql entity-framework