0

(英語で申し訳ありません)たとえば、私のDALには、Nameを持つAuthorDBオブジェクトと、TitleとIdAuthorを持つBookDBオブジェクトがあります。

ここで、対応する著者の名前ですべての本を表示する場合は、すべての本のコレクションを取得する必要があります。各本について、IdAuthor属性を使用して著者の名前を見つけます。これにより、データベースに対して多くのクエリが実行され、明らかに、単純なJOINを使用できます。

私のオプションは何ですか?著者の名前と本のタイトルを含む「カスタム」オブジェクトを作成しますか?もしそうなら、メンテナンスがひどくなる可能性があります。

それで、オプションは何ですか?ありがとうございました!

4

5 に答える 5

3

信頼性が高く、効率的で、一般的なツールが利用できる場合は、バグのある、非効率的で、特殊なものを作成しないでください。無料で。

ORM を選択します。NHibernate、ActiveRecord、SubSonic、NPersist、LinqToEF、LinqToSQL、LLBLGenPro、DB4O、CSLA など。

于 2008-10-12T16:47:50.007 に答える
0

ご意見をお寄せいただき、誠にありがとうございました。

実際には、データベース オブジェクトをデータベース内の対応するテーブルの実際の列にできるだけ近づけようとしています。そのため、(文字列) 'Author' 属性を BookDB オブジェクトに実際に追加することはできません。

「ビュー」オブジェクトを使用する際に見られる問題は次のとおりです。データベースで、何らかの理由でスキーマを変更する必要がある場合 (例: Book テーブルでは、'The_Title' の 'Title' 列を変更する必要があります。つまり、複数の結合を使用するクエリを作成するときに、どのオブジェクトを変更する必要があるかを知るにはどうすればよいでしょうか?

ここでは、AuthorsBooks オブジェクトがあるため、おそらく本と著者のテーブルに対してクエリを実行することが名前からわかります。ただし、テーブル間で 4 つまたは 5 つの結合を行うオブジェクトでは、オブジェクト名に頼ることはできません。

何か案は?(ありがとう、これは素晴らしいサイトです!)

于 2008-10-12T16:40:17.807 に答える
0

結合が組み込まれたデータベースにビューを作成し、AuthorBooksDB などのオブジェクトをそれにバインドできます。ビューは基本的な変更を非表示にして静的なままにすることができるため、メンテナンスの頭痛の種になることはあまりありません。

于 2008-10-11T19:07:37.573 に答える
0

データベース クエリをオブジェクトの構築から分離できれば、クエリを作成して必要なデータを取得できます。次に、そのデータをビルダーに渡し、本を返してもらいます。

Linq to SQL を使用すると、次のように簡単に実行できます。

public IEnumerable<Book> AllBooks()
{
    return  from book in db.Books
            join author in db.Authors on book.AuthorId equals author.Id
            select new Book() 
                        { 
                            Title = book.Title, 
                            Author = author.Name,
                        };
}

DataTables / DataSets でも同じことが実現できます。

public IEnumerable<Book> AllBooks()
{
    DataTable booksAndAuthors = QueryAllBooksAndAuthors(); // encapsulates the sql query

    foreach (DataRow row in booksAndAuthors.Rows)
    {
        Book book = new Book();
        book.Title = row["Title"];
        book.Author = row["AuthorName"];
        yield return book;
    }
}
于 2008-10-11T20:31:38.357 に答える
0

ドメイン駆動設計をご覧になることをお勧めします。DDD では、すべてのビジネス オブジェクトをリポジトリから取得します。リポジトリはデータ ストアと実装を隠し、データのクエリ方法とデータベースの変更の追跡方法に関する問題を解決します。すべてのビジネス オブジェクトはリポジトリから取得されるため、リポジトリが単一の変更点になります。次に、リポジトリは効率的な方法でデータベースにクエリを実行し、そのデータからドメイン オブジェクトを構築します。

var books = new BookRepository().GetAllBooks();

Justice によって言及されたテクノロジのいずれかを使用して、リポジトリをコーディングできる必要があります。

于 2008-10-12T22:35:38.323 に答える