1

オブジェクトのサブエンティティをハイドレイトするためのリポジトリレベルでの最良のアプローチは何ですか。例:システム内のすべての人のリストが必要です。一人一人が多くの電話番号を持つことができます。リポジトリにこのすべてのデータを入力するにはどうすればよいですか?

public class Person
{
    public int? Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public List<Phone> PhoneNumbers { get; set; } 
}

    public IEnumerable<Person> GetPeople()
    {
        var persons = new List<Person>();
        const string sql = "SELECT FirstName, LastName, MiddleName FROM Person.Person";

        while (reader.Read())
        {
            var p = PersonFactory.GetPerson(reader);
            p.PhoneNumbers = this.GetPhoneByPersonId(p.Id);
            persons.Add(p);
        }

        return persons;
    }

    public IEnumerable<Phone> GetPhoneByPersonId(int? id)
    {
        while (reader.Read())
        {
            numbers.Add(PersonFactory.GetPhone(reader));
        }
    }

このアプローチでの私の問題は、DBにヒットする一連のSQLステートメントを実行していることです。それは最善のアプローチとは思えません。フレームワークを使用できず、DataReaderを使用する必要があります。

私が取ることができるより良いアプローチは何ですか?また、これは簡単な例です。私のPersonオブジェクトにはさらに多くのリストがあります。

4

1 に答える 1

1

メソッドを実装するための1つのアプローチは、GetPeople複数の結果セットを含む単一のSQLステートメントを実行することです。MARSが有効になっているSQLServerを使用している場合、これは単一のクエリへの応答としてサーバーから送信されます。それ以外の場合は、2つのクエリを実行できます。1つは人を取得するためのもので、もう1つはそれらの人に関連付けられるすべての電話番号を取得するためのものです。

クエリは次のようになります。

SELECT FirstName, LastName, MiddleName FROM Person.Person WHERE -- omitted

SELECT PhoneNumber,Name FROM Person.PhoneNumbers WHERE -- restrict to same set as above

この場合も、サーバーがサポートしている場合は、1つのコマンドで両方のクエリを送信するか、2つの別々のクエリを発行することができます。いずれにせよ、それはたった2つのクエリであり、大したことではありません。一度に多くの結果を返さないようにしてください。

2つの結果セットをメモリに保存したら、個人IDでそれらを結合し、すべての個人インスタンスを対応する電話番号に関連付けることができます。全体として、1つまたは2つのデータベースクエリを実行しています。

IDataReaderは、クエリによって返される複数の結果セットを列挙するためのメソッドNextResultを提供します。

于 2012-08-28T02:03:55.493 に答える