我正在尝试查询一个使用 ADO.NET 的项目中的Oracle DB(版本11.2.0.2.0),在.NET 4上编译(如果Windows XP与.NET 4.5兼容,我会在.NET 4.5上编译),并使用linq to entities来执行查询。我还使用适用于Visual Studio的Oracle开发人员工具 ODP.NET 版本11.2.0.3.20。但是,每当在应用程序中执行查询时,我都会返回具有不正确数据的对象列表。我所说的错误数据的意思是:我在实体对象中有 5 个属性,其中两个属性未设置为实体键。未设置为实体键的两个属性包含返回的所有记录的相同数据...但是当我使用 DB 查询客户端在数据库上手动执行查询时,我在每条记录的这些列中得到不同的值!
这是我得到的自动生成的代码(使用 DBContext,但我已经验证了这种情况也会发生在 ObjectContext 中):
public partial class EntityObj
{
public string EntityKey1 { get; set; }
public string EntityKey2 { get; set; }
public string EntityKey3 { get; set; }
public Nullable<decimal> NonEntityKey1 { get; set; }
public string NonEntityKey2 { get; set; }
}
这是我的 linq to 实体代码:
using (Entities context = new Entities())
{
string formattedStr = Decimal.Parse(str).ToString();
var objs = (from obj in context.EntityObjs
where obj.Number == formattedStr
orderby obj.EntityKey3 , obj.NonEntityKey2, obj.NonEntityKey1
select obj);
// Process results...
}
下面是手动执行查询时获得的结果集示例:
| 实体密钥1 | 实体密钥2 | 实体键3 | 非实体键1 | 非实体密钥2 |----------------------------------------------------------------------------------| 价值1.1 | 价值1.2 | 价值1.3 | 1 | 价值1.4 |----------------------------------------------------------------------------------| Val2.1 | Val2.2 | Val2.3 | 2 | Val2.4 |----------------------------------------------------------------------------------| Val3.1 | Val3.2 | Val3.3 | 3 | Val3.4 |----------------------------------------------------------------------------------| Val4.1 | Val4.2 | Val4.3 | 4 | Val4.4 |
下面是使用 linq to 实体时获得的结果集的示例:
| 实体密钥1 | 实体密钥2 | 实体键3 | 非实体键1 | 非实体密钥2 |----------------------------------------------------------------------------------| 价值1.1 | 价值1.2 | 价值1.3 | 1 | 价值1.4 |----------------------------------------------------------------------------------| Val2.1 | Val2.2 | Val2.3 | 1 | 价值1.4 |----------------------------------------------------------------------------------| Val3.1 | Val3.2 | Val3.3 | 1 | 价值1.4 |----------------------------------------------------------------------------------| Val4.1 | Val4.2 | Val4.3 | 1 | 价值1.4 |
为什么我会看到我看到的结果,以及如何修复它以返回正确的数据,而无需使非实体键字段成为实体键?(它们不能是键,因为它们可为空)
编辑:
我还应该指出,当我执行以下查询时,我没有看到相同的问题......但我真的希望事情像我之前说过的那样工作。
using (Entities context = new Entities())
{
string formattedStr = Decimal.Parse(str).ToString();
var objs = (from obj in context.EntityObjs
where obj.Number == formattedStr
orderby obj.EntityKey3 , obj.NonEntityKey2, obj.NonEntityKey1
select new
{
EntityKey1 = obj.EntityKey1,
EntityKey2 = obj.EntityKey2,
EntityKey3 = obj.EntityKey3,
NonEntityKey1 = obj.NonEntityKey1,
NonEntityKey2 = obj.NonEntityKey2
});
// Process results...
}
问题可能是因为您的实体对象中可能没有一个好的主键。看看这里给出的解决方案..如果这是您的问题,这可能会解决您的问题。