【发布时间】:2017-04-13 22:48:21
【问题描述】:
我的数据库中有以下视图
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 份副本。有什么我看不到的原因吗?
【问题讨论】:
-
我了解到 EF 不能很好地处理视图,因为它确实需要实体的键,并且在视图的情况下,它只会使用所有可能导致的不可为空的列奇怪的结果。 stackoverflow.com/questions/36889910/…
-
@juharr - 除非您像映射表一样映射它并指定使记录唯一的主键列。
-
我会更改视图,以便在没有唯一列的情况下存在唯一列,并确保将其映射为 EF 中的主键。如果这不是一个选项,请尝试将代码更改为
b.WSS_PortalSubmissions.AsNoTracking(),以便 EF 不跟踪实体,这应该强制它只返回查询的结果而不尝试基于主键进行跟踪。 -
@Igor AsNoTracking() 非常适合我。我完全忘记了 EF 的主要关键问题(已停用近一年)。
-
@Marc - 很高兴我能帮上忙。