以下の最小限のコード例では、どのような動作を説明できますか?与えられたフィールドまたはプロパティに対して、new
演算子を使用していても、Entry
クラスの同じ2つのインスタンスがLINQ to SQLクエリの各繰り返しで再利用されているようです。同じ問題は、LINQ toオブジェクトクエリでは表示されません。 .NET Framework 4を使用してSQL Server 2005 Enterpriseデータベースに接続するC#コンソールアプリケーションプロジェクトを作成しました。LINQ to SQLクエリで 'new'演算子を使用しましたが、すべての結果で同じインスタンスが参照されています
public class Set
{
public Entry Field;
public Entry Property { get; set; }
}
public class Entry
{
public int ID;
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
var dc = new DataClasses1DataContext(); // just create a simple dbml with some table from some database
var resultQuery = (
from x in dc.SomeTable
select new Set()
{
Field = new Entry(),
Property = new Entry()
}
);
var sets = resultQuery.ToArray();
Test(sets);
var source = Enumerable.Range(0, 10);
var sourceQuery = (
from x in source
select new Set()
{
Field = new Entry(),
Property = new Entry()
}
);
var sets2 = sourceQuery.ToArray();
Test(sets2);
}
static void Test(Set[] sets)
{
var f = sets[0].Field;
Console.WriteLine(sets.All(x => object.Equals(x.Field, f)));
var p = sets[0].Property;
Console.WriteLine(sets.All(x => object.Equals(x.Property, p)));
Console.Writeline(sets.Length);
Console.WriteLine(object.Equals(f, p));
Console.WriteLine();
}
}
SQLクエリにLINQのためTest()
の出力が生成Set
オブジェクトのすべてについて、全Field
メンバーが同じ単一Entry
インスタンスを指し、すべてことを示し
True
True
1362
False
ありますProperty
のメンバーが同じシングルを指していますEntry
インスタンス。つまり、同じインスタンスがクエリの各反復でそれぞれのメンバーに再利用されます。
オブジェクトクエリにLINQのためTest()
の出力は、新しい個別のインスタンスは、クエリの各反復で作成されていることを示し
False
False
10
False
あります。
LINQ to SQLの動作が予期されるか、またはバグですか?これがEntity Frameworkで発生するかどうかは誰にも分かりますか?
'dc.SomeTable'に複数の行がありますか?あなたは 'Console.WriteLine(sets.Count());'を追加できますか? –
良い点。はい、私のテストでは何千もの行があります。 'sets.Length> 1'です。 – BlueD