创建SQL查询并将其注入DAL

时间:2017-11-07 16:47:59

标签: c# sql-server entity-framework

我想写一个DAL来对我的应用程序的低级别的输入模型,数据规范化和一些其他加密任务进行映射,我想限制我的SQL查询只能通过DAL运行。 我将dbContext更改为private以实现最后一个。 但是为了将查询传递给DAL,我需要一种构建和传递所有类型的SQL查询的方法,我可以将它们注入DAL,然后对主要的EntityModel运行最终查询。

例如我尝试这种方式没有任何结果:

Main.cs:

IEnumerable<DataAccess.Model.Group> Output = new List<DataAccess.Model.Group>();
Output = from A in Output.Where(P => P.Name.StartsWith("A")) select A;
Group.FakeSelect(Output);

在我的DAL中我尝试了类似的东西:

public List<Group> FakeSelect(IEnumerable<Group> Query, out List<NewGroup> NewModel)
{
    IQueryable<Group> Source = GetQuery();
    Query = Query.Union(Source);
    return (from A in Query select new NewGroup{....}).ToList();
}

我使用此函数获取主要的entityModel查询:

public IQueryable<DataAccess.Model.Group> GetQuery()
{
        ShamsEntities Entities = new ShamsEntities();
        return Entities.Set<DataAccess.Model.Group>();
}

我希望看到名称以(&#34; A&#34;)开头的所有行,但结果是整个表格的行。

2 个答案:

答案 0 :(得分:2)

如果您将SQL查询从另一层传递到DAL - 那么它不是您的DAL,因为SQL非常“DA(数据访问)”,所以应该只存在于DAL中。您可能希望为每种类型的查询创建方法,将Filter类型对象或表达式对象传递给DAL,然后DAL可以解析并运行相关的SQL。否则,如果您想换掉数据访问方法,例如使用XML文件而不是数据库 - 您将不得不更改所有代码,而不仅仅是您的DAL,从而无法将其分隔到第一名!

P.S。加密可能不应该是DAL的责任......

编辑:您链接的文章中的这一段解释了我的意思:

  

在数据访问层中封装数据访问功能。   数据访问层应隐藏数据源访问的详细信息。   它应该负责管理连接,生成查询,   并将应用程序实体映射到数据源结构。消费者   数据访问层通过抽象接口进行交互   应用程序实体,如自定义对象,TypedDataSets和XML,   并且应该不了解数据的内部细节   访问层。以这种方式分离关注有助于应用   开发和维护。

答案 1 :(得分:-1)

编写查询是业务逻辑问题,而不是DAL问题。需要哪些实体,它们的形状和排序方式是业务逻辑方法或事务脚本的详细信息。如果您正在编写一些业务逻辑并需要跳转到DAL以实现返回所需数据的新方法,那么您就会混淆问题。

DAL应隐藏所使用的存储库的详细信息,因此发明了LINQ,因此查询可以以与存储库无关的方式表示,并以业务逻辑层的语言表达。

LINQ还支持查询组合和延迟执行,因此与支持LINQ的存储库或DAL(如EF DbContext)交互的预期和推荐方式是业务逻辑层以IQueryable属性开头,并且建立自定义查询。