实体框架:针对 EF 中的视图的查询(C# 代码)返回重复结果

本文关键字:代码 返回 结果 查询 框架 针对 EF 视图 实体 | 更新日期: 2023-09-27 18:32:49

我正在使用 EF 对数据库视图进行查询。 查询可以返回正确数量的记录,但所有记录都相同。但是,当我在 sql SSMS 中运行原始查询时,一切都很好。
有人可以提供有关可能的根本原因的一些线索吗?

视图定义如下所示:

 CREATE VIEW [dbo].[v_JobAEWeekly]
  AS
  SELECT        
  VCId, 
  JobRegistryId, 
  JobNamingId, 
  JobPrefix, 
  DATEADD(dd, DATEDIFF(week, CONVERT(DATETIME, '2013-01-01 00:00:00', 102), JobDate) * 7 - 2, CONVERT(DATETIME, '2013-01-01 00:00:00', 102)) AS JobDateWeekSeqStartDate,       
  COUNT(*) AS JobCounts,    
  FROM            dbo.HistoricalJobInfo
  WHERE        (JobStateId = 2) AND (TotalYieldTimeInMinutes = 0)
  GROUP BY VCId, JobRegistryId, JobNamingId, JobPrefix, DATEADD(dd, DATEDIFF(week, CONVERT(DATETIME, '2013-01-01 00:00:00', 102), JobDate) * 7 - 2, CONVERT(DATETIME, '2013-01-01 00:00:00', 102))
  GO

查询如下所示:

//Problem:This query will return two records but the two records are the same. 
var jobAEWeeklyHistory = contextDjs.v_JobAEWeekly.Where(x => x.JobRegistryId == 11 && x.JobDateWeekSeqStartDate > date).ToList();

实体框架:针对 EF 中的视图的查询(C# 代码)返回重复结果

逆向工程 Code First 实际上类似于 Database First,因为它会为您生成模型、映射和数据上下文。

正如@Aducci所建议的那样,您的问题很可能是由错误的实体键引起的。查看此问题以获取详细说明。

问题在于主键。
EF 中的每个实体都应有一个 ID,因此应具有主键。如果源表/视图没有主键,EF 将尝试注入自身。所以问题来了,EF 会将所有不可为空的列组合为键。当 EF 在本地具体化对象时,它将仅选择具有相同键的第一个对象。