我正在运行一个简单的LINQ查询,该查询连接到一个视图并返回所有带有我发送的id的数据。
我的简单查询是:
var data = db.ViewDataAlls.Where(x => x.guidRequirementId == guidRequirementId);
如果我在数据库中运行此查询:
select * from viewDataAll where guidrequiremendid = '{Guid Id Sent In Here}'
我得到2行,但是LINQ查询返回2行,但是行是第一行的副本,而不是2行。
有什么想法吗?
编辑:如果我运行此LINQ查询:
List<string> nums = db.ViewDataAlls
.Where(x => x.guidRequirementId == guidRequirementId)
.Select(x=>x.strNumber).ToList();
我得到了单独的行号,但如果我只是尝试拉出整行,我会多次复制第一行......
答案 0 :(得分:2)
我遇到了同样的问题。我已经准备好断定这是Linq-to-SQL中的一个错误。针对视图的直接SQL查询工作,Linqpad查询工作等等...但由于某种原因有时会查询视图(甚至不经常提醒您,但是当我发现某个特定值失败时,它似乎总是这样做)失败了。我验证了 Linq传递给SQL Server的查询是正确的(来自SQLServer日志),所以当Linq收到它们时,结果似乎被破坏了。直接查询视图或通过定义的关联访问视图内容会产生相同的错误结果。
意识到问题出在查询的接收端(在结果传回Linq之后),我最终将其跟踪到我将视图添加到dbml的方式。最初我将视图拖到dbml设计器表面上,并添加了一个关联到我想要链接到的表,一个基本的一对多关联(使用基本的fkid == id关系)。但是我无法在代码中从表中访问视图。我发现我需要为子(view)添加一个主键,所以我将id属性设置为PK。这似乎有效,直到我通过关联对视图执行.SingleOrDefault()时出现意外异常。知道我的数据不可能对我过滤的属性有更多的命中,我通过调试器运行它,并且我确实得到了正确数量的结果(在我的情况下为2),但是第二个结果只是第一个的副本。 OP看到了同样的事情。
最终解决方案是将视图的所有字段设置为主键的一部分(在dbml中;我只有3)。不知何故,将id字段作为单独的PK对于Linq来说是不够的。一旦我这样做,我没有进一步的问题。 (可能没有必要将每个字段指定为PK的一部分,因此您可能希望进行实验,但显然只有一个id不足。)
请注意,我确实在dbml中将视图设置为“not unique”,人们认为这样可以防止这种情况发生。显然不是这样。
答案 1 :(得分:0)
ViewDataAlls是视图还是表。如果是视图,则生成该视图的sql语句可能会生成重复项。
答案 2 :(得分:0)
感谢JHurdlow,你节省了我的一天。看起来LINQ在视图中不使用groupby或order-by。在我的例子中,视图中的SQL语句是正确的,并且数据显示得非常好,但出于任何原因,在我的MVC3上使用LINQ时不同并重复行。在我的情况下,我有一个包含5个表的视图,我必须将所有字段作为PK放在___DataModel.edmx
的视图上。现在工作正常。
此解决方案意味着所有字段必须不为null,否则必须在View模式上使用CASE NULL-THEN END。