[英]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對象暴露給進行表示層工作的最終開發人員。 我願意提出想法和建議。
所以我認為我已經能夠找到解決方案。 使用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.