LINQ to Entities 未返回预期结果
我正在使用视图返回复杂的搜索查询。当我使用 linq 查询 EF 时,它返回同一行 3 次(实际行数是正确的)。
使用 LinqPad,我对我的 ef 实体和实际数据库视图运行了相同的 linq。
ReadmitPatientList
.AsQueryable()
.Where("PatientLastName.StartsWith(\"cooper\")")
.OrderBy (rpl => rpl.PatientLastName)
.Dump();
这就是我为两者使用的 linq。
linqpad 将 lambda 显示如下: EF:
ReadmitPatientList.MergeAs (AppendOnly)
.Where ( => .PatientLastName.StartsWith ("cooper"))
.OrderBy (rpl => rpl.PatientLastName)
DB
ReadmitPatientList
.Where ( => .PatientLastName.StartsWith ("cooper"))
.OrderBy (rpl => rpl.PatientLastName)
我无法发布结果...但 EF 返回同一记录的三行。 DB 返回 3 行单独记录。我的 sql 查询也是如此。
我需要对 EF LINQ 进行哪些更改才能使其正常工作?
如果在 SQL 资源管理器中运行,EF Linq 查询生成的 SQL 代码实际上会返回正确的结果。
I am using a view to return a complex search query. When I usin linq to query against EF it is returning the same row 3 times(the actual rowcount is correct).
using LinqPad I have run the same linq against my ef entity and the actual database view.
ReadmitPatientList
.AsQueryable()
.Where("PatientLastName.StartsWith(\"cooper\")")
.OrderBy (rpl => rpl.PatientLastName)
.Dump();
That is the linq I am using for both.
linqpad shows the lambda as this:
EF:
ReadmitPatientList.MergeAs (AppendOnly)
.Where ( => .PatientLastName.StartsWith ("cooper"))
.OrderBy (rpl => rpl.PatientLastName)
DB
ReadmitPatientList
.Where ( => .PatientLastName.StartsWith ("cooper"))
.OrderBy (rpl => rpl.PatientLastName)
I cannot post the results...but EF returns three rows of the same record. DB returns 3 rows of individual records. As does my sql query.
What about my EF LINQ do I need to change to make it work correctly?
The sql code that is generated by the EF Linq query Actually returns the correct results if run in SQL explorer.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果患者实体没有主键,或者由于结果集中的多个记录中的主键相同而推断出的列,则会发生这种情况。 EF 使用内部身份映射,这要求每个唯一标识的记录必须重用实体的相同实例。因此,如果您从数据库返回三个具有相同 EF 唯一标识的记录,将返回代表结果集中第一条记录的三个相同实例的枚举(有关标识映射的更多信息也此处)。 Linq-to-sql 的 DataContext 中也有相同的行为。
This happens if Patient entity doesn't have primary key or columns inferred as primary key are same across multiple records in the result set. EF uses internally identity map which requires that each uniquely identified record must reuse the same instance of the entity. So if you return three records from the database which have same unique identification for EF will return enumeration of three same instances representing the first record from the result set (more about identity map also here). The same behaviour is in Linq-to-sql's DataContext.