ADO.NETを使用し、.NET 4でコンパイルされたプロジェクト(WindowsXPと互換性がある場合は.NET4.5でコンパイルされます)でOracle DB(バージョン11.2.0.2.0)をクエリしようとしています。クエリを実行するエンティティへのlinq。VisualStudioおよびODP.NETバージョン11.2.0.3.20用のOracleDeveloperToolsも使用しています。ただし、アプリケーションでクエリを実行すると、データが正しくないオブジェクトのリストが返されます。間違ったデータとは、エンティティオブジェクトに5つのプロパティがあり、そのうちの2つがエンティティキーとして設定されていないことを意味します。エンティティキーとして設定されていない2つのプロパティには、返されるすべてのレコードに対して同じデータが含まれています...しかし、DBクエリクライアントを使用して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です:
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 |
linqtoentitiesを使用したときに得られる結果セットの例を次に示します。
| 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 |
表示されている結果が表示されるのはなぜですか。また、非エンティティキーフィールドをエンティティキーにせずに正しいデータを返すように修正するにはどうすればよいですか。(これらはnull可能であるため、キーにすることはできません)
編集:
次のクエリを実行しても同じ問題は発生しないことも指摘しておく必要があります...しかし、私が述べたように実際に機能させたいと思います前。
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...
}