这个问题已经有了答案:
Entity Framework maps data wrong when the identity column is not unique
1个答案
不知道为什么会被认为是骗局。问题是完全不同的。答案是不同的。不知道该换什么。如果有人看到我丢失的东西,请告诉我…
我使用这两个查询得到的结果数目不同。在分析了几个小时之后,我不得不认输,承认我看不出两者的区别。因为我的方法库已经空了,所以我请求帮助。
林肯

List<Uno> result = context.Unos
  .Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
    (uno, duo) => new { Uno = uno, Duo = duo })
  .Where(item => item.Uno.Amount > 0
    && item.Duo.Type == 2)
  .Select(item => item.Uno)
  .ToList();

SQL语言
select * from Uno as u
join Duo as d on d.CommonId = u.CommonId
where u.Amount > 0
  and d.Type = 2

第一个问题是上面两个陈述是否确实相等,或者我是否遗漏了什么。第二个问题是我缺少什么(如果有的话)或者如何解决它(如果我没有)。
对同一数据库进行调用。
结果的数目相差甚远(142和1437)。
为内部联接获取相同的结果集。
UNO和DUO都是视图,而不是表。
我还能核实什么?
编辑
经过社区的大力支持,我们确定可以通过以下命令对linq查询进行sql化。
var wtd = context.Unos
  .Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
    (uno, duo) => new { Uno = uno, Duo = duo })
  .Where(item => item.Uno.Amount > 0
    && item.Duo.Type == 2)
  .Select(item => item.Uno)
  .ToString();

疯狂的是,在sql manager中执行这个字符串会产生142个结果(就像上面例子中的查询,sql版本一样),而且它与之的差别非常小。但是,执行linq查询本身会产生1437个结果。我太糊涂了,甚至都不想哭…
“选择[extent1].[commonid]作为[commonid],\r\n[extent1].[x]作为[x]\r\n from(选择[uno].[commonid]作为[commonid],\n[uno].[x]作为[x],[finance].[uno]作为[uno])作为[extent1]\r\n内部联接(选择[duo].[commonid]作为[commonid],\n[duo].[y]作为[y],\n[duo].[z]作为[z],\ n[duo].[type]为[type],\n[duo].[u]为[u],\n[duo].[v]为[v],[finance].[duo]为[duo])的[extent2]为[extent1].[commonid]=[extent2].[commonid]\r\n其中([extent1].[x]>cast(0为decimal(18)),([extent2].[type]=@p\u linq\u 0)”

最佳答案

在实体框架中映射视图时,经常会发生这种情况。与常规数据库表不同,视图通常没有明确的唯一键值。当ef遇到主键值相同的行时,它只复制属于它已经知道的键的行。在联接中,这可能会导致ef生成更多的子记录,因为第一个已知行可能比实际数据库行具有更多的子记录。
修复方法是确保视图具有唯一标识行的字段(或字段组合)。当然,在ef中,应该将其映射为(可能是复合)主键。
我不知道为什么英孚会表现出这种行为。我认为它应该可以抛出一个异常,它实现了重复的实体。这个“功能”总是引起很多混乱。

07-27 13:59