簡體   English   中英

將業務層的通用查詢轉換為數據訪問層

[英]Translate Generic Query of Business Layer to Data Access Layer

我正在將舊版軟件重寫為.Net,並且已經使用運行良好的Linq 2 SQL創建了數據訪問層。 我正在使用的數據庫有230多個表,並不是我真正可以更改的東西。 我遇到的問題是業務層。 我希望開發人員能夠查詢業務對象並將那些查詢映射到數據層。 所以像Customers.Query(c=>c.ID=="MyID")類的東西可以傳遞給我的DAL, context.CUSTOMERS.Query(c=>c.UID == "MyID")我我的DAL中有通用的Query方法,這使我可以傳遞DAL查詢。

這就是我卡住的地方。 我可以創建一個使用表達式的方法,但如何獲取然后將這些字段映射到相應的DAL字段並獲取試圖匹配的值。 我不想要的是必須將DAL對象暴露給進行表示層工作的最終開發人員。 我願意提出想法和建議。

開發人員是否需要使用表達式查詢業務對象? 我問的原因是因為映射表達式可能很復雜。 在某些時候,必須完成一些映射。 DAL通常是將DB對象轉換為域對象的映射層,反之亦然。

需要考慮的另外兩種方法:

  1. 使用存儲庫模式,在此模式中,調用者將傳遞查詢對象。 DAL將負責將該查詢對象轉換為表達式。 我提出問題中顯示了存儲庫模式的示例。

  2. 公開更具體的方法,例如:

    公開客戶GetCustomersById(int id){...}

我相信這兩種方法中的任何一種都會使查詢變得更容易。

所以我認為我已經能夠找到解決方案。 使用ExpressionVisitor這篇文章的幫助

我修改了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());
        }

性能似乎還不錯,我知道映射會大受好評,但是我現在可以接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM