3

次の例を検討してください。

データベース (Stackoverflow に似ています) には、同じテーブル内に質問と回答をPostTypeフィールドで区別できるテーブルがあります。質問でも回答でも、最新の投稿のリストを取得したいと思います。

質問と回答は共通のプロパティを共有するため、両方のクラスが抽象クラスを継承しContentBaseます。各タイプに関連するフィールドをいくつか追加するだけです。

IList<ContentBase>個々のアイテムが具体的なタイプであるQuestionAnswer、基準フィールドに基づいている場合に、キャスト先のコンテンツ アイテムのリストを取得するにはどうすればよいですか。

public abstract class ContentBase
{
    public int Id { get; set; }

    public string Title { get; set; }

    public User Author { get; set; }

    public abstract ContentType Type { get; }

    ...
}

public class Question : ContentBase
{
    public override ContentType Type
    {
        get { return ContentType.Question; }
    }

    ...
}

public class Answer: ContentBase
{
    public override ContentType Type
    {
        get { return ContentType.Answer; }
    }

    ...
}

私のリポジトリには次の呼び出しがあります。

IList<ContentBase> result = db.GetLatest();

私は PetaPoco/NPoco を使用していますが、Dapper を使用した場合も同じ問題が発生すると思います。

質問

ContentType特定のフィールドの値 (この場合) に基づいて正しい具象型をインスタンス化するように DAL に指示するにはどうすればよいですか?

説明

私はこれらの行に沿って何かをする必要があります:

db.Fetch<ContentBase, User>(...)

しかしContentBase、抽象クラスなのでできません。この行を次のように変更すると:

db.Fetch<dynamic, User>(...)

InvalidOperationExceptionNPoco からCan't auto join Userというメッセージが表示されるため、まだ機能しません。

これを行う唯一の方法は、継承された新しいクラスを作成し、デリゲートPocoDataの独自の実装を提供することだと思います。おもう。具体的な POCO がインスタンス化される拡張ポイントは他にないと思います。抽象祖先クラスを処理しているため、この方法で行うべきかどうか、どのように行うべきかわかりません。GetFactory

4

1 に答える 1

2

私がこれを正しく理解しているかどうかはわかりません。

  1. Enum の整数値を取得し、Q&A を 1 つのコレクションにロードし、メモリ内でそれを Q'a と A に分割する基本クラスを作成することで、これを解決できますか? これははるかに簡単なようです。

  2. 多分Q&Aを別々に取得します:

    var s = @"select q.Id, q.Title, q.ContentType as Type , q.Author as Name from QA q where q.ContentType = @0;";
    var q = db.Fetch<Question,User>(s,1);
    var a = db.Fetch<Answer, User>(s,2);
    
  3. 複数の結果セットを使用してこれを解決できますか?

    var sql  = @"select * from QA where contenttype = 1; select * from qa where
    contenttype  =1;";
    var com = db.FetchMultiple<Question,Answer>(sql);
    com.Dump();
    

注:私の db テーブルは に使用さnvarcharれ、のベースでUser作成されました。stringUser

の列挙型を作成しましたContentType

void Main()
{
    var sql  = @"select * from QA where contenttype = 1; select * from QA where contenttype  = 2;";
    var com = db.FetchMultiple<Question, Answer>(sql);

    com.Dump();
}

ここで使用されるその他のメソッドとタイプ

public enum ContentType
{
    Question,
    Answer
}

public abstract class ContentBase
{
    public int Id { get; set; }

    public string Title { get; set; }

    public string Author { get; set; }

    public abstract ContentType Type { get; }
}

public class Question : ContentBase
{
    public override ContentType Type
    {
        get { return ContentType.Question; }
    }
}

public class Answer: ContentBase
{
    public override ContentType Type
    {
        get { return ContentType.Answer; }
    }
}
于 2014-04-01T05:44:06.203 に答える