【问题标题】:LINQ to Entities not returning expected resultLINQ to Entities 未返回预期结果
【发布时间】:2011-05-20 20:45:38
【问题描述】:

我正在使用视图返回复杂的搜索查询。当我使用 linq 查询 EF 时,它返回同一行 3 次(实际行数是正确的)。

使用 LinqPad,我对我的 ef 实体和实际的数据库视图运行了相同的 linq。

ReadmitPatientList
    .AsQueryable()
    .Where("PatientLastName.StartsWith(\"cooper\")")
    .OrderBy (rpl => rpl.PatientLastName)
    .Dump();

这是我用于两者的 linq。

linqpad 将 lambda 显示为: 英法:

ReadmitPatientList.MergeAs (AppendOnly)
   .Where ( => .PatientLastName.StartsWith ("cooper"))
   .OrderBy (rpl => rpl.PatientLastName)

数据库

ReadmitPatientList
   .Where ( => .PatientLastName.StartsWith ("cooper"))
   .OrderBy (rpl => rpl.PatientLastName)

我无法发布结果...但 EF 返回同一记录的三行。 DB 返回 3 行单独的记录。我的 sql 查询也是如此。

我需要更改我的 EF LINQ 以使其正常工作吗?


如果在 SQL 资源管理器中运行,EF Linq 查询生成的 sql 代码实际上会返回正确的结果。

【问题讨论】:

  • 我不确定我是否理解。行数是否正确,如 3 或 1?你可以试试 .Where("it.PatientLastName LIKE 'cooper%'")。
  • 行数应该是同一个人的 3 条唯一记录。 (即三个不同的访问) EF 查询返回相同的记录 3 次。直接数据库查询正确返回
  • @ours 我在 EF 上尝试了同样的结果,但它不适用于 Straight DB。

标签: linq-to-sql linq-to-entities linqpad


【解决方案1】:

如果患者实体没有主键或推断为主键的列在结果集中的多条记录中相同,则会发生这种情况。 EF 使用内部身份映射,这要求每个唯一标识的记录必须重用实体的相同实例。因此,如果您从数据库返回三个具有相同 EF 唯一标识的记录,则将返回三个相同实例的枚举,这些实例代表结果集中的第一条记录(有关身份映射的更多信息也为 here)。 Linq-to-sql 的 DataContext 中也有同样的行为。

【讨论】:

  • GAH...你知道吗,我想我确实为 get 添加一个关键属性到 ROWID 字段...让我试试然后回复你。
  • ok 将键属性添加到 RowID 属性不起作用。 RowID 是一个 GUID,因此它是唯一的。由于我使用的是视图,我该如何解决这个问题,我认为即使是 sproc 也会有这个问题。
  • erm..只是为了澄清我将密钥添加到我的 DomainService 元数据文件中。我不知道如何使用 linq,但我的应用程序在重新编译后仍然显示相同的行为。
  • 好的,在我的模型图中,我可以看到它似乎推断出患者ID 是键值,这是不正确的。
  • 我想我找到了解决方法,我在 edmx 中编辑了实体并将推断的键更改为我想要的 rowid 现在测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多