Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 面向对象的Linq2Sql查询类_C#_.net_Oop_Linq To Sql - Fatal编程技术网

C# 面向对象的Linq2Sql查询类

C# 面向对象的Linq2Sql查询类,c#,.net,oop,linq-to-sql,C#,.net,Oop,Linq To Sql,在实习期间,我正在创建一个与后台数据库通信的程序。 程序以MVC(模型-视图-控制器)方式分层 对于视图,我希望通过我称为DataAccesLayer(DAL)的东西访问数据。因为该视图的知识最少,所以我希望它为我要调用的查询传递一个ID。调用将在DAL内完成。然后使用ID,我想让一个包含查询的类返回查询,然后在DAL中执行它。用于可视化的图片 现在的问题是如何在Read函数中执行查询。DAL的代码如下所示: public class DataAccesLayer { private

在实习期间,我正在创建一个与后台数据库通信的程序。 程序以MVC(模型-视图-控制器)方式分层

对于视图,我希望通过我称为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;
    }
}
公共类查询
{
私人字典查询;
私有ErrorLoggerWinLog记录器;
公众查询()
{
logger=ErrorLoggerWinLog.Instance();
queryDict=新字典();
queryDict.Add(1,来自数据库驱动程序中的d
选择d);
}
公共对象GetQuery(int-ID)
{
var查询;
if(queryDict.TryGetValue(ID,out query)==false)
{
logger.WriteLine(“查询”,“找不到指定的查询”,ErrorLoggerWinLog.loggerlevel.Error);
}
返回查询;
}
}
我在想,这可能吗?现在它似乎不起作用。我可能忘记了什么或错过了一些重要的事情。有没有人有过这种设置的经验,或者应该考虑一种完全不同的解决方案

编辑:现在它似乎没有执行查询,就像我在read函数中缺少一个命令一样。Datacontext是填充的,这是在程序的另一个部分中完成的


Edit2:现在我正在研究IRepository模式,这是一次很棒的学习体验,谢谢大家花时间评论和回答

在任何时候,您的
queryDict
只有一个元素;
GetQuery()
不记录错误消息且不返回null的唯一时间是将1传递给它。因此,
Read(1)
返回所有驱动程序的列表,否则抛出
NullReferenceException
,因为,
query
为null

您应该使用如下内容:

    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和存储库模式:


在这个问题上做得很好,+1代表图片=]但是。。。。。到底是什么不起作用?您仍然需要将db上下文对象连接到实际的数据库。现在,您有一个未连接的上下文。然后您需要通过上下文实际执行查询。为什么需要这种“类似查询”的解决方案?我会在DataAccesLayer上创建一个名为GetDriveres的方法,并直接从控制器(您的视图类实际上应该是一个控制器,因为视图用于可视化数据)laszlokiss88调用它,如果这是唯一需要的查询,那就太好了,但到目前为止,我已经列出了30个查询和计数。这只是选择查询。