面向对象的Linq2Sql查询类

6
为了我的实习,我正在创建一个与后台数据库通信的程序。该程序采用MVC(模型-视图-控制器)的分层方式。
对于视图,我想通过我称之为数据访问层(DAL)的东西来访问数据。因为该视图具有最小的知识,所以我希望它传递一个查询ID。调用将在DAL内部完成。然后,使用ID,我想要查询一种包含查询的类,以便返回查询结果并在DAL内部执行。如下图所示。

enter image description here

现在我的问题是如何在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;
    }
}

我在想,这是可能的吗?目前看来好像不起作用。我可能忘记了什么或者错过了重要的东西。有人对这种设置有经验吗?还是应该寻找完全不同的解决方案?

编辑:目前似乎无法执行查询,就像我在读取函数中缺少一个命令一样。但数据上下文已经填充了,在程序的其他部分完成了这个操作。

编辑2:我正在研究IRepository模式,这是一次很棒的学习体验,感谢所有花时间评论和回答问题的人!


问题提得很好,加一分赞 for 图片 =] - Sean Airey
然而...... 到底哪里出了问题呢? - Sean Airey
你仍然需要将db上下文对象连接到实际数据库。现在,你有一个未连接的上下文。然后,你需要通过上下文实际执行查询。 - ThaMe90
1
为什么需要这个“类似查询”的解决方案?我会在DataAccesLayer中创建一个名为GetDriveres的方法,并直接从控制器调用它(你的View类实际上应该是一个控制器,因为View是用于可视化数据的)。 - laszlokiss88
@Freakz0rz 这就是DataAccessLayers的作用。然而,如果你有很多类似的查询,比如GetDrivers、GetCars等等,没有筛选条件,你可以创建一个通用的IQuerable<T> Get<T>()方法。更不用说,在控制器中你会怎么做?你会转换当前Read方法的对象结果吗?这也不方便... - laszlokiss88
显示剩余3条评论
1个回答

3

在任何时候,你的queryDict只有一个元素;当你传递1作为参数给GetQuery()时,GetQuery()不会记录错误信息并且不会返回null。因此,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和存储库模式: 如何使用LINQ to SQL创建通用数据访问对象(DAO)CRUD方法

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接