0

次のように定義されたDataContextとTableがあります。

public class MyDataContext : DataContext
{
    public Table<MyItem> MyItems;

    public MyDataContext(string location) : base(location) { }
}

[Table(Name = "MyItems")]
public class MyItem
{
    // ID
    private string id;

    [Column(Storage = "id", IsPrimaryKey = true, IsDbGenerated = true, DbType = "int NOT NULL IDENTITY")]
    public string Id
    {
        get { return id; }
        private set { id = value; }
    }

    private MyDataContext db;
    private MyTransitiveObject obj;

    public MyItem() {}

    public MyItem(MyDataContext db, MyTransitiveObject obj)
    {
        this.db = db;
        this.obj = obj;
    }
}

テーブルの新しいものを作成するときは、とにかくコンストラクターMyItemを呼び出すので問題はありません。MyItem(MyDataContext db, MyTransitiveObject obj)

MyDataContext db = new MyDataContext(someLocation);
MyItem myItem = new MyItem(db, someObj);
db.MyItems.Add(myItem);
db.SubmitChanges();

ただし、データベースから一連の行を取得する場合は、もちろん、推移的なメンバーは設定されません。ただし、取得したオブジェクトで作業を行う前に、それらを初期化する必要があります。

私が考えることができる唯一の解決策は、メンバーをグローバルにし、クエリされたすべてのオブジェクトを調べて、他の操作を行う前にそれらを設定することです。しかし、これはきちんとしたものではありません。

var q =
   from c in db.Customers
   select c;

var list = q.ToList();

foreach (MyItem m in list)
{
    q.Db = db;
    q.Obj = someObj;
}

/* Do something with list */

これを処理するための最良の方法は何でしょうか?

4

2 に答える 2

1

あなたはこのようなことをすることができます:

var q = from c in db.Customers
        select new MyItem
        {
            Id = c.Id,
            // copy rest of c to MyItem
            Db = db,
            Obj = someObj
        };

これにより、変換がクエリにまとめられるため、結果セットをループする必要がありません。ただし、各オブジェクトのコンテキストを保存する必要があるのは奇妙に思えます。

ただし、テーブルに列を追加する場合は、MyItemコンストラクターを更新する必要があります。

于 2013-03-09T11:40:35.897 に答える
0

すべての要素内にコンテキストとデータベース参照を保存する理由がわかりません。最初からデザインを考え直したほうがいいと思います。

コンストラクターを使用してステートメントを拡張selectして要素を作成することはできますが、SQL に変換できなかったため、最初に要素を取得する必要があります。ただし、フィールドを公開する必要はありません。

var q =
   from c in db.Customers
   select c;

var list = q.ToList()
            .Select(e => new MyItem(db, someObj) { Id = e.Id })
            .ToList();

q.ToList()LINQ to SQL (すべての要素を取得する) と LINQ to Objects (コンストラクターを使用して新しい要素を作成する) の間で実行を分割するために必要です。と交換することもできましAsEnumerable()た。

于 2013-03-09T11:42:43.567 に答える