C#实体LINQ返回错误和重复值

问题描述:

我使用下面的代码:C#实体LINQ返回错误和重复值

List<vw_GetIMeasurements> Imeasurements = context.vw_GetIMeasurements.Where(f => f.MEMBERID == userID).Distinct().ToList(); 

这将返回一个列表有12个值像它应该,但这些数值都是一样的(即使他们不在DB(即使它们是不同的应该解决这个问题)

Visual of the issue

DB:

Database Image

返回的原始值也是错误的。 这个问题的原因是什么?我该如何解决?

+1

'vw_GetIMeasurements'是否实现'Equals'和'GetHashCode'? – 2012-07-17 12:18:44

+0

你能提供一些测试数据吗? – 2012-07-17 12:19:57

+0

是的,它确实实现了这些。 – Metabie 2012-07-17 12:20:19

之前,我有过这样的问题 - 事实证明,认为没有独特entity keys设置 - 确保您的视图的主键由实体框架自动创建,确实是独一无二的...

+0

我无法更改数据库,有没有其他方法可以实现这一点? – Metabie 2012-07-17 12:51:00

+0

您不需要更改数据库 - 它在设计器中的模型(.edmx文件),确保实体键足够独特,EF将尝试创建唯一键,但它并不总是适合视图。 – 2012-07-17 12:57:08

+0

问题是所有这些值都不是唯一的,所以它们总是出现multipel时间。我想我可以通过选择我需要的2个柱子而不是整个行来解决我所遇到的问题。 – Metabie 2012-07-17 13:00:09

也许尝试一个更简单的语法像这样

var measure = from f in context.vw_GetIMeasurements 
       where f.MEMBERID == userID 
       select f; 

这种事情为我工作..

+0

嗯,我试图找回多个值的列表。这将如何完成? – Metabie 2012-07-17 12:28:29

+1

这种linq请求返回IENUMERABLE 。您可以在此之后应用.Tolist()以获取列表 bAN 2012-07-17 12:30:51

+0

非常遗憾,这给出了与问题中相同的值。即使原始价值是错误的。 – Metabie 2012-07-17 12:37:49

这个问题事实上是Richard所描述的。但是我无法选择正确的“唯一密钥”,因此造成了更多问题。

我通过创建一个自定义类并在SQL中创建它来解决我的问题。我也将我的选择限制在3列中的2列。

List<Measurement> result = (from f in context.vw_GetIMeasurements where f.MEMBERID == userID select new Measurement { Category = f.atcmCATEGORYCODEID, Size = f.imMeasurementNumber }).ToList(); 

测量是在自制类的情况下。

我有一个类似的问题 - 数据库视图在SQL服务器中看起来很好,但在调试时,重复行出现在行共享特定属性值的位置。

我发现其中一个重要的唯一键是来自外部连接表 - 因此有可能为空 - 并且该模型没有指定为唯一键。

我能够通过将此字段设置为ISNULL(field,'') - 确保始终返回值 - 并且在更新时正确解释该字段为唯一并且作为化合物的一部分来解决此问题键和行正确返回。

我知道有人可能会认为视图设计有问题(即我不应该使用外部联接),但在这种情况下,外部联接具体需要。修复工程因为复合键仍然是唯一的,即使多次返回“”。