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都只有一个元素;唯一GetQuery()不记录错误消息且不返回null的时间是您将 1 传递给它时。结果Read(1)返回所有驱动程序的列表,否则抛出一个NullReferenceException因为,嗯,query是空的。

你应该使用这样的东西:

    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 和 Repository 模式:

如何使用 LINQ to SQL 创建通用数据访问对象 (DAO) CRUD 方法

于 2013-08-29T09:44:25.607 回答