6

私のインターンシップでは、バックグラウンドでデータベースと通信するプログラムを作成しています。プログラムは MVC(Model-View-Controller) 方式で階層化されています。

ビューの場合、DataAccesLayer(DAL) と呼ばれるものを介してデータにアクセスしたいと考えています。そのビューには最小限の知識しかないため、呼び出したいクエリの ID を渡す必要があります。呼び出しは DAL 内で行われます。次に、ID を使用して、クエリを保持するクラスにクエリを返し、DAL 内で実行するように依頼します。視覚化のための画像。

ここに画像の説明を入力

私が今抱えている問題は、Read 関数でクエリを実行する方法です。DAL のコードは次のとおりです。

public class DataAccesLayer
{
    private Queries queryloader;
    private RoadsoftDigitacV8DataContext db;

    public DataAccesLayer()
    {
        queryloader = new Queries();
        db = new RoadsoftDigitacV8DataContext();
    }

    public List Read(int ID)
    {
        IQueryable query;
        query = queryloader.GetQuery(ID);

        return query.ToList();
        
    }

}

クエリ クラスのコード:

public class Queries
{
    private Dictionary<int, IQueryable object> queryDict;
    private ErrorLoggerWinLog logger;

    public Queries()
    {
        logger = ErrorLoggerWinLog.Instance();
        queryDict = new Dictionary<int, IQueryable object>();
        queryDict.Add(1, from d in db.Drivers
                         select d);
    }

    public object GetQuery(int ID)
    {
        var query;
        if(queryDict.TryGetValue(ID, out query) == false)
        {
            logger.WriteLine("Queries", "Could not find the query specified", ErrorLoggerWinLog.loggerlevel.Error);
        }
        return query;
    }
}

私は疑問に思っています、これは可能ですか?現在、機能していないようです。私はおそらく何かを忘れているか、何か重要なものを見逃しています。この種のセットアップの経験がある人はいますか、それともまったく別のソリューションを検討する必要がありますか?

編集:現在、読み取り関数にコマンドが欠落しているように、クエリを実行していないようです。ただし、Datacontext は満たされていますが、これはプログラムの別のセクションで行われています。

Edit2: 今、私は IRepository パターンを調べています。これは素晴らしい学習体験です。コメントとアンサーに時間を割いてくれた皆さんに感謝します!

4

1 に答える 1

3

queryDict要素は常に 1 つしかありません。GetQuery()エラー メッセージをログに記録せず、 nullを返さないのは、1 を渡したときだけです。結果として、すべてのドライバーのリストを返します。それ以外の場合は、 nullであるため、Read(1)をスローします。NullReferenceExceptionquery

次のようなものを使用する必要があります。

    public class DriversDAL
    {
        private RoadsoftDigitacV8DataContext db;

        public DriversDAL()
        {
            db = new RoadsoftDigitacV8DataContext();
        }

        public Driver GetDriver(int ID)
        {
            return db.Drives.Single(d => d.ID == ID);
        }

    }

一般的なソリューションが必要な場合は、一般的な dao とリポジトリ パターンを使用する必要があります。

LINQ to SQL を使用してジェネリック データ アクセス オブジェクト (DAO) CRUD メソッドを作成する方法

于 2013-08-29T09:44:25.607 に答える