我正在尝试在使用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...
}
以下是我手动执行查询时得到的结果集示例:
| EntityKey1 | EntityKey2 | EntityKey3 | NonEntityKey1 | NonEntityKey2 | ---------------------------------------------------------------------------------- | 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用于实体时获得的结果集示例:
| EntityKey1 | EntityKey2 | EntityKey3 | NonEntityKey1 | NonEntityKey2 | ---------------------------------------------------------------------------------- | 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...
}