- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经为这个问题苦苦挣扎了好几天。一位同事针对他也创建的 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。不幸的是,它没有帮助,因为我所做的更改与他的代码所做的相同。
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.columns
和 sys.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/
我正在为我的模型获取一些行,但是 View 有太多的标准,我厌倦了编写许多模型。为了让工作更轻松,我不想为每个选择的标准编写新的选择语句,所以一开始我尝试了尝试并仍然从选择中返回某些内容,即使用户提供
所以我想知道为什么: SELECT Colunm_Name Column_Name from Table_Name WITHOUT 列名之间的逗号不会返回语法错误,而是仅返回包含第一列的记录。起初我以
我有一个这样的 REST 端点: www.icecreamstore.com/stock?brand=hershey&flavour=vanilla 现在, brand 和flavour 都是可选的。
这个问题在这里已经有了答案: What is the difference between using squared brackets or dot to access a column? (5 个
我是 SQL 新手,目前正在阅读“自学 SQL 书籍” 书中提到有时您需要用列名指定表名(紧接在 SELECT 行之后)以获得您想要的结果。还提到无论如何这样做通常是很好的做法。这是一个具体的例子:
我有一个帖子表和一个用户表,我还有一个介于两者之间的表,其中包含两者之间的关系。一个用户可以有很多帖子等。 可以通过在帖子表的加星标列中添加 0 或 1 来对帖子进行“加星标”。每个用户只能为一个帖子
我需要在column_name之后移动column_name; 我已完成以下操作: 更改表表名在 columns_name 之后修改列 columns_name; 任何建议, 最佳答案 这应该适合你:
在 SQL Server 中修剪字符串的两端时,是否存在性能差异,或者在构建where 子句? 例如: WHERE RTRIM(LTRIM(SalesPerson)) <> '' 最佳答案 您的查询可
我对在单个查询中使用 COUNT(column_name) 两次的性能感到好奇。这是有问题的查询: SELECT employee_name, COUNT(employee_name)
我遇到了一个让我抓狂的问题。 运行下面的查询时,我得到的计数为 233,769 SELECT COUNT(distinct Member_List_Link.UserID) FROM Memb
使用IN选择计算机必须匹配的软件名称动态列表,并且数据库中存在已知值的数据,使用时的结果: GROUP BY id HAVING COUNT(DISTINCT column_name) = count
我有一个包含以下列的“表单”表:id, name, desc, exporter1, exporter2,exporter3 我的目的是在这些列的值等于特定值时获取列名。 考虑“表单”表中的以下行,
有没有一种方法可以将 alter 语句应用于表中的所有列而无需指定列名?这只会用在我需要清理报告中重复数据的临时表中。 这是我想知道是否可行的示例: select T1.Column1, T1.Col
我有这个框架,2 列(蓝色和红色)和值 (0,1) **Blue Red** 0 1 1 1 我想要这样的 Dataframe 结果,如果列 Red 的值为 1,则
我正在进行迁移,其中重命名了列:货币变为legacy_currency等。问题是,当我尝试获取表的列名称时,它返回旧值。 尝试使用reset_column_information,但没有成功。还尝试了
所以我试图查询一个有接近 1000 条记录的数据库表,并且我试图根据某个列(主题)值是否在以下值中从表($subject)中获取行一个特定的数组($topics)。 所以我的函数看起来像这样。 pub
如何从表二中选择*并从表一中选择计数(t_type),其中表一和表二中的物种相等 表一 = 树 id | t_type ~~~~~~~~~~~~ 1 | Tree one 2 | Tree two
为了生成表更改的数据库更改日志,我使用 Liquibase。但liquibase变更日志不携带列名的具体位置。 以下更改集是通过 liquibase 生成的
我有一个非常大的表,我想过滤列和值的黑名单组合。黑名单是一个表(小得多),其中一列是列名(称为“键”),另一列是要过滤掉的值。我不想对任何列名或值进行硬编码,因为黑名单将用于多个表。 我正在使用 po
我有这个问题: SELECT EquipmentNumber, EquipmentType, P.AreaCode AS Location, EquipDsc FROM MajorEquipment
我是一名优秀的程序员,十分优秀!