2011-05-20 91 views
3

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

使用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返回相同记录的三行。数据库返回3行个人记录。正如我的SQL查询。

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


由如果SQL Explorer中运行的EF Linq查询实际上返回正确的结果生成的SQL代码。

+0

我不知道我明白。 rowcount与3或1一样是否正确?你可以试试.Where(“it.PatientLastName LIKE'cooper%'”)。 – 2011-05-20 20:50:24

+0

rowcount应该是同一个人的3个唯一记录。 (即三次不同的访问),EF查询将返回相同的记录3次。直接db查询返回正确 – ecathell 2011-05-20 22:23:06

+0

@ours我试过这种方式与同样的结果再次EF,它不会对直数据库工作。 – ecathell 2011-05-20 22:36:21

回答

4

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

+0

GAH ...你知道吗,我想我是为了在ROWID字段中添加一个关键属性...让我尝试一下,然后回复你。 – ecathell 2011-05-21 15:59:28

+0

确定将关键属性添加到R​​owID属性不起作用。 RowID是一个GUID,所以它将是唯一的。我如何解决这个问题,因为我使用的是一个视图,即使是一个sproc也会遇到这个问题。 – ecathell 2011-05-21 16:15:23

+0

erm..just澄清我将密钥添加到我的DomainService元数据文件。我不知道如何使linq使用,但我的应用程序在重新编译后仍然显示相同的行为。 – ecathell 2011-05-21 16:16:29