C# 将业务层的通用查询转换为数据访问层 我在重写遗留软件到.NET的过程中,使用LINQ 2 SQL创建了一个数据访问层。我正在使用的数据库有230多个表,我真的无法更改。我遇到的问题是业务层。我希望开发人员能够查询业务对象,并将这些查询映射到数据层。类似于Customers.Query(c=>c.ID==“MyID”) 并将其传递给我的DAL,context.CUSTOMERS.Query(c=>c.UID==“MyID”) 我的DAL中有通用查询方法,允许我传入DAL查询

C# 将业务层的通用查询转换为数据访问层 我在重写遗留软件到.NET的过程中,使用LINQ 2 SQL创建了一个数据访问层。我正在使用的数据库有230多个表,我真的无法更改。我遇到的问题是业务层。我希望开发人员能够查询业务对象,并将这些查询映射到数据层。类似于Customers.Query(c=>c.ID==“MyID”) 并将其传递给我的DAL,context.CUSTOMERS.Query(c=>c.UID==“MyID”) 我的DAL中有通用查询方法,允许我传入DAL查询,c#,architecture,layer,C#,Architecture,Layer,这就是我被困的地方。我可以创建一个使用表达式的方法,但如何获取并将这些字段映射到相应的DAL字段,并获取尝试匹配的值。我不想让做表示层工作的最终开发人员看到DAL对象。我愿意听取意见和建议。开发人员是否需要使用表达式查询业务对象?我问的原因是映射表达式可能很复杂。在某些时候,必须进行一些映射。DAL通常是将DB对象转换为域对象的映射层,反之亦然 需要考虑的其他两种方法: 使用存储库模式,调用者在其中传入查询对象。DAL将负责将该查询对象转换为表达式。存储库模式的示例如图所示 公开更具体的方法,如

这就是我被困的地方。我可以创建一个使用表达式的方法,但如何获取并将这些字段映射到相应的DAL字段,并获取尝试匹配的值。我不想让做表示层工作的最终开发人员看到DAL对象。我愿意听取意见和建议。

开发人员是否需要使用表达式查询业务对象?我问的原因是映射表达式可能很复杂。在某些时候,必须进行一些映射。DAL通常是将DB对象转换为域对象的映射层,反之亦然

需要考虑的其他两种方法:

  • 使用存储库模式,调用者在其中传入查询对象。DAL将负责将该查询对象转换为表达式。存储库模式的示例如图所示

  • 公开更具体的方法,如:

    公共客户getCustomerById(int-id){…}


  • 我相信这两种方法中的任何一种都会使事情更容易查询。

    所以我想我已经找到了解决这个问题的方法。使用和帮助

    我修改了VisitMember方法:

        protected override Expression VisitMember(MemberExpression node)
        {
            string sDbField = ((SFWBusinessAttributes)node.Expression.Type.GetProperty(node.Member.Name).GetCustomAttribu`tes(typeof(SFWBusinessAttributes), true)[0]).DBColumn;
            var expr = Visit(node.Expression);
            if (expr.Type != node.Type)
            {
                MemberInfo newMember = expr.Type.GetMember(sDbField).Single();
                return Expression.MakeMemberAccess(expr, newMember);
            }
            return base.VisitMember(node);
        }
    
    从业务对象的属性中提取属性

    要从应用程序调用我可以执行的所有操作,请执行以下操作:

        BusObj.Query(a => a.IsDeleted != true && a.Company.Contains("Demo"))
    
    它调用业务对象中的方法

        public List<Account> Query(Expression<Func<Account, bool>> expression)
        {
            using (Data.CustomerData data = new Data.CustomerData(_connstring))
            {
                 return MapList(data.Query<Data.Database.ACCOUNT>(expression.Convert<Account, Data.Database.ACCOUNT>()).ToList());
            }
    
    公共列表查询(表达式)
    {
    使用(Data.CustomerData数据=新数据.CustomerData(_connstring))
    {
    返回映射列表(data.Query(expression.Convert()).ToList());
    }
    

    性能似乎很好,我知道映射会受到冲击,但这是我目前可以接受的。

    开发人员需要查询对象,有230个业务对象,并为每个对象创建特定的方法是不可执行的、GetById、GetByName、GetByContract……等等。我将业务对象映射到数据对象通过通用映射方法,问题是如何进行查询,我如何智能地查询业务对象属性并将这些属性传递给DAL以检索正确的数据。理想情况下,如果我可以使用这个BusLay.shippings.query(s=>s.ShipId==“bob”)并能够将其转换为DAL.shippings.Find(s=>s.shipping\u ID==“bob”)。我可以将结果映射回去。我避开了存储库模式,因为我似乎要复制我的业务层,方法是创建反映Linq已创建的对象的对象到Sql,以便我可以将它们映射到开发人员将使用的业务层对象。最终,表示层开发人员甚至没有访问DAL。他们将查询业务对象以绑定到网格,并执行他们需要执行的任何功能。我给你a+1,因为这是一个有趣的问题。我有几个朋友可能会提出一些建议。让我向他们展示你的问题。。。