gpt4 book ai didi

c# - 查询的结果从 Entity Framework 查询返回与 COLUMN_NAME 相同的值,这是没有意义的

转载 作者:行者123 更新时间:2023-12-04 07:53:52 26 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了好几天。一位同事针对他也创建的 SQL Server View 编写了 LINQ 查询,该 View 返回 18 行作为他筛选的表名。
他创建的 View 使用系统 View INFORMATION_SCHEMA .奇怪的是,当 LINQ 查询返回结果时,COLUMN_NAME 的所有值是 ID .
但是,当我运行 SELECT 时反对同样的观点,所有COLUMN_NAMES是不同的。我不明白为什么会有差异。
这是 SQL Server View :

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'
他倾向于声明要使用的全局 DbContext。我认为这是问题所在,所以我只稍微更改了代码以使用本地 DbContext。不幸的是,它没有帮助,因为我所做的更改与他的代码所做的相同。
只有这个区别,这个 C# 代码的其余部分是他的:
using (var ctx = new CoreFrameworkEntities())
{
var dd_fields_query = ctx.vwDataDictionaries.Where(d => d.TABLE_NAME == CurrentTableName);
var dd_fields_query_list = dd_fields_query.ToList();

foreach (var item in dd_fields_query_list)
{
string col_name = "";

foreach (var camel in SplitCamelCase(item.COLUMN_NAME))
{
col_name = col_name + camel + " ";
}

col_name = col_name.Replace("_", "").Trim();

if (item.COLUMN_NAME == "ID")
{
col_name = "ID";
}
else if (item.COLUMN_NAME == "InstrumentID")
{
col_name = "Instrument ID";
}
else if (item.COLUMN_NAME.EndsWith("ID"))
{
col_name = item.COLUMN_NAME.Split('I')[0] + " ID";
}

KeyValuePair<vwDataDictionary, string> kvp = new KeyValuePair<vwDataDictionary, string>(item, col_name);
TableFields.Add(kvp);
}
}
这是 SELECT我写道,将结果与 LINQ 查询产生的结果进行比较:
SELECT * 
FROM Core.vwDataDictionary
WHERE TABLE_NAME = 'Proficiency'
那么,为什么 LINQ 查询返回 18 行,所有行的值为“ID”,而 SELECT返回 18 行,所有行都具有 Proficiency 的正确列名 table ?

最佳答案

从 Entity Framework 中使用时, View 存在一个微妙的问题。
如果你有一个带 EF 的表,你需要有一个 主键 以唯一标识每一行。通常,那是一列,例如ID或类似的东西。
对于 View ,您没有“主键”的概念—— View 只包含某些表中的一些列。
因此,当 EF 映射 View 时,它找不到主键 - 因此,它将使用 View 中的所有不可为空的列作为“替代”主键。
当 EF 现在读取数据时,它将获取所有列并创建一个代表该行的内存对象。如果 EF 现在稍后从数据库中读取另一行 其中那些不可为空的列 构成您 View 的替代 PK 是相同的 - 然后它会想:“哎呀,我已经有了那行”,然后将同一对象的另一个副本添加到您的结果集中。
因此,在这种情况下,最终您的 中可能会有 18 行相同的行。 EF 结果集 - 即使 SQL Server 输出正确显示不同的数据。 ......
更新:作为可能的解决方案,您可以尝试点击 sys.columnssys.tables提供“更好”列的目录 View - 不可为空的列,每列都不相同......
尝试这样的事情:

CREATE VIEW [Core].[vwDataDictionary] 
AS
SELECT
t.Name,
t.object_id,
c.Name,
c.column_id
-- possibly later more columns here....
FROM
sys.tables t
INNER JOIN
sys.columns c ON c.object_id = t.object_id

关于c# - 查询的结果从 Entity Framework 查询返回与 COLUMN_NAME 相同的值,这是没有意义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66805039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com