Linq to Entities 奇怪的结果

3

我在数据库中有以下的视图

SELECT  YEAR(Received) AS YEAR, 
        MONTH(Received) AS MONTH, 
        LEFT(DATENAME(MONTH, Received), 3) AS MMM, 
        COUNT(Received) AS Submissions, 
        COUNT(Quoted) AS Quotes, 
        COUNT(Bound) AS Binders, 
        COALESCE (SUM(BndPremium), 0) AS Premium, 
        ProducerID
  FROM  dbo.Quote AS Q WITH (NOLOCK)
  WHERE (Received >= DATEADD(year, - 1, GETDATE()))
  GROUP BY ProducerID, YEAR(Received), MONTH(Received), DATENAME(MONTH, Received)

我已经将视图添加到我的EDMX中。我通过以下方式查询视图:

var submissions = from s in db.WSS_PortalSubmissions
                  where s.ProducerID == ID
                  select s;

在“提交”结果中,但是是第一个月的12个副本,而不是过去12个月的结果。今天在Linq中运行查询时,我得到了2016年4月份结果的12个副本。如果我在SSMS中运行查询,我会得到预期的结果,即最近12个月的列表。
我尝试了.ToList()、.ToArray(),甚至尝试了一些结果的排序,但结果并未改变。它只给了我第一个月的12个副本。有什么原因我没有看到吗?

2
我了解到EF与Views不兼容,因为它真的需要实体的键,而在View的情况下,它将只使用所有非空列,这可能会导致奇怪的结果。 https://dev59.com/dloU5IYBdhLWcg3w9aai - juharr
1
@juharr - 除非您像映射表格一样映射它并指定一个使记录唯一的主键列,否则不行。 - Igor
2
如果视图中没有唯一的列,请更改视图,确保将其映射为EF中的主键。如果这不是一个选项,请尝试更改代码为b.WSS_PortalSubmissions.AsNoTracking(),以便EF不会跟踪实体,这应该强制它仅返回查询结果,而不是基于主键进行跟踪。 - Igor
@Igor AsNoTracking() 对我非常有效。我完全忘记了 EF 中的主键问题(已经有近一年没有实践了)。 - Marc
@Marc - 很高兴我能帮到你。 - Igor
1个回答

2

如果没有唯一的列,请更改视图并确保它被映射为EF中的主键。如果这不是一个选项,请尝试更改代码为

var submissions = from s in db.WSS_PortalSubmissions.AsNoTracking()
       where s.ProducerID == ID
       select s;

为了使EF不跟踪该实体,这应该强制它仅返回查询结果,而不是根据主键跟踪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接