2015-03-02 66 views
-1

我開發了一個帶有ASP.NET MVC 5和實體框架的n層電子商務應用程序。 Mybe當然,我可以在將來改變我的DAL。但我可以弄清楚應該如何爲我的DAL層動態查詢。想象一下,用戶在網站上列出產品,他們可以按產品類型或類別等過濾產品。可能是按價格或按字母順序排序的產品等。我的意思是我需要完全動態的查詢。在這一點上,我使用EF,如果我創建了我的動態查詢,如果它不適用於其他DAL技術(nhibername,ado.net等)。 我該怎麼辦?使用動態查詢的DAL層

//in my controller 
var db = ApplicationDbContext.Create(); 
IQueryable<Product> query = from q in db.Products 
    where 
     q.ProdType == ProdType.StorPerde && q.UserId == LoggedUserId && 
     !selectedStorPerdeId.Contains(q.ProdId) 
    select q; 
List<Product> prods = _productService.GetAll(query); 

//service layer 
public List<Product> GetAll(IQueryable<Product> query) 
{ 
    return _productDal.GetAll(query); 
} 

//dal 
public List<Product> GetAll(IQueryable<Product> query) 
{ 
    return query.ToList(); 
} 

回答

1

那麼,首先,你並沒有真正使用這種當前的方法使用單獨的數據訪問層。您的控制器直接訪問上下文獲得IQueryable,然後您將其傳遞到服務層,僅調用.ToList()即可。這破壞了擁有單獨圖層的整個觀點。完全將您的邏輯移入您的服務層。

接下來,具有服務層的要點是要抽象數據源以及如何使用它。因此,應該圍繞需要檢索的特定信息創建服務層方法。例如,如果您需要獲取特定用戶的產品,則應該有一些方法,如GetProductsForUser(int userId)

最後,對於需要能夠提交任意查詢的更復雜場景,您可以允許服務層方法接受實際的過濾器:Get(Expression<Func<TEntity, bool>> filter)。該類型的參數將允許您通過標準的m => m.Foo == "Bar"樣式where子句。但是,這一點在這方面不太方便,因爲過濾器更具體地針對實施。大多數ORM可能會允許你內在地使用這種類型的參數,但是你可能需要跳過一些箍環來將它轉換爲Web Api之類的東西。

您可能還想考慮將諸如此類的任務卸載到像Elasticsearch這樣的真正的Search Appliance。