c# - 为什么这个迭代是在一个列表上没有从 SQL 视图中给我正确的值?
问题描述
我正在开发一个必须在数据网格中显示表格的新应用程序。数据网格的列由我的一位同事编写的 SQL 视图检索。但是,返回的数据看起来像重复数据,例如,如果 SQL 查询格式不正确,您会得到这样的数据。下面是定义 SQL 视图的代码:
Create view [Core].[vwDataDictionary] as
SELECT ROW_NUMBER() OVER(order by A.[TABLE_CATALOG]) AS [ID]
,A.[TABLE_CATALOG]
,A.[TABLE_SCHEMA]
,A.[TABLE_NAME]
,A.[COLUMN_NAME]
,[ORDINAL_POSITION]
,[COLUMN_DEFAULT]
,[IS_NULLABLE]
,[DATA_TYPE]
,[CHARACTER_MAXIMUM_LENGTH]
,[CHARACTER_OCTET_LENGTH]
,[NUMERIC_PRECISION]
,[NUMERIC_PRECISION_RADIX]
,[NUMERIC_SCALE]
,[DATETIME_PRECISION]
,[CHARACTER_SET_CATALOG]
,[CHARACTER_SET_SCHEMA]
,[CHARACTER_SET_NAME]
,[COLLATION_CATALOG]
,[COLLATION_SCHEMA]
,[COLLATION_NAME]
,[DOMAIN_CATALOG]
,[DOMAIN_SCHEMA]
,[DOMAIN_NAME]
,B.[CONSTRAINT_NAME]
,C.[CONSTRAINT_TYPE]
FROM [INFORMATION_SCHEMA].[COLUMNS] AS A
left join
[INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] AS B
on A.TABLE_NAME = B.TABLE_NAME and A.COLUMN_NAME = B.COLUMN_NAME
left join
[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] AS C
on B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
where A.[TABLE_SCHEMA] = 'App'
但是,数据网格显示如下数据:
所以,我决定通过创建一个控制台应用程序来简化事情,只从视图中提取数据并迭代返回的内容。我首先在现有数据库中使用了 EF 的代码。这是控制台应用程序的代码:
class Program
{
static void Main(string[] args)
{
using (var ctx = new CodeModel())
{
var bozo = ctx.vwDataDictionaries.ToList();
int i = 0;
foreach (var item in bozo)
{
i++;
Console.WriteLine($"i: {i}, ID: {item.ID}, TABLE_NAME: {item.TABLE_NAME}, COLUMN_NAME: {item.COLUMN_NAME}");
}
}
Console.WriteLine("Finished");
}
}
但是如果我运行那个控制台应用程序,我会得到这样的值:
在 C# 应用程序中运行查询会返回 282 条记录。都有一个列名“ID”。但是,如果我在 Azure Data Studio 中运行相同的查询,我会得到以下信息:
当然,我知道我没有进行排序或过滤,但我仍然不明白为什么示例程序会为 COLUMN_NAME 返回这么多重复项。
我正在使用 VS 2019 版本 16.8.2。.NET 框架 4.5.2 和 EF 6。
解决方案
我不确定您到底在期待什么,但列可以有多个约束。看起来您正在获取整个架构中所有列的列表,而不是单个表的列。
如果您查看查询中的三个表中的每一个;
select * from [INFORMATION_SCHEMA].[COLUMNS] order by table_schema, TABLE_NAME
select * from [INFORMATION_SCHEMA].[CONSTRAINT_COLUMN_USAGE] order by table_schema, TABLE_NAME
select * from [INFORMATION_SCHEMA].[TABLE_CONSTRAINTS] order by table_schema, TABLE_NAME
您可能会更好地了解与您的期望不同的地方。
推荐阅读
- python - 索引numpy矩阵
- excel - 用户窗体最小化时取消滚动
- swift - Swift:尝试访问数组中对象的值时出现错误
- cookies - 如何在 AspNet Core 中列出带有更改的 cookie
- nexus - 配置 helm 连接到 nexus
- swisscomdev - 在 Swisscom Application Cloud 上自动创建、恢复和下载 MongoDB 备份
- http - JMeter:我如何对随机 2 个浮点数求和
- laravel - npm 的新手 get SyntaxError: Unexpected token
- ios - Xcode 10 上的 iOS 模拟器崩溃
- php - WordPress CSRF 漏洞利用草案状态