实体框架:在EF(C#代码)中查看视图会返回重复的结果

时间:2014-12-01 12:02:36

标签: c# sql-server entity-framework

我正在使用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();

2 个答案:

答案 0 :(得分:2)

反向工程代码首先实际上类似于Database First,因为它为您生成模型,映射和数据上下文。

很可能你的问题是由错误的实体密钥引起的,正如@Aducci建议的那样。请查看this question以获取详细说明。

答案 1 :(得分:1)

问题与主键有关 EF中的每个实体都应该有一个ID,因此也就是主键。如果源表/视图没有主键,EF将尝试注入自己。所以问题来了,EF会将所有非可空列的组合作为密钥。当EF在本地实现对象时,它只会选择具有相同Key的第一个对象。