我正在尝试在使用 ADO.NET 的项目中查询 Oracle DB(版本 11.2.0.2.0),在 .NET 4 上编译(如果 Windows XP 与之兼容,我将在 .NET 4.5 上编译),并使用linq 到实体以执行查询。我还在使用 Oracle Developer Tools for Visual Studio 和 ODP.NET 版本 11.2.0.3.20。但是,每当在应用程序中执行查询时,我都会返回一个包含不正确数据的对象列表。我所说的不正确数据的意思是:我在实体对象中有 5 个属性,其中两个属性没有设置为实体键。未设置为实体键的两个属性包含返回的所有记录的相同数据......但是当我使用数据库查询客户端手动对数据库进行查询时,我在每条记录的这些列中得到不同的值!
这是我得到的自动生成的代码(使用 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 代码:
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 | -------------------------------------------------- -------------------------------- | Val1.1 | VAL1.2 | Val1.3 | 1 | Val1.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 | -------------------------------------------------- -------------------------------- | Val1.1 | VAL1.2 | Val1.3 | 1 | Val1.4 | -------------------------------------------------- -------------------------------- | Val2.1 | Val2.2 | Val2.3 | 1 | Val1.4 | -------------------------------------------------- -------------------------------- | Val3.1 | Val3.2 | Val3.3 | 1 | Val1.4 | -------------------------------------------------- -------------------------------- | Val4.1 | Val4.2 | Val4.3 | 1 | Val1.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...
}