2013-05-30 46 views
0

我正在用c#編寫一個數據訪問層來查找數據庫中的庫存項目。我有一個像getStockItemByStockCode(string stockCode)這樣很容易的方法,但是如何編寫一個基於屬性組合來查找stockItem的方法?數據訪問層根據多個屬性查找記錄

例如,如果我向方法傳遞StockFilter對象並設置要過濾的屬性,如何創建實體框架查詢來完成此操作而不會變得複雜?或者我應該只是獲取所有記錄並將其過濾到業務層,這對我來說聽起來不太合適,因爲這意味着我將帶回不需要的數據。

這是我使用的股票代碼,讓我的股票項目的方法:

public StockDTO getStockItemByStockCode(string stockCode) 
    { 

     StockDTO stockItem = null; 

     using (var db = new DbContext()) 
     { 
      var aStock = (from stock in db.STK_MASTER 
         where stock.STOCK_CODE.Equals(stockCode) 
         select stock).Single(); 


      Mapper.CreateMap<STK_MASTER, StockDTO>(); 
      StockDTO stockDto = Mapper.Map<STK_MASTER, StockDTO>(aStock); 

      stockItem = stockDto; 

     } 
     return stockItem; 

    } 

這是我想使用基於屬性的組合讓我的股票項目的方法標題:

public StockDTO getStockItem(StockFilter stockProperties) 

有,我可以用這個模式還是什麼? 庫存物品屬性可能包括諸如上次銷售日期,銷售數量,價格範圍等內容

+1

介意使用'Expression >'? – Fendy

+0

我想你想使用StockDTO作爲查詢參數來匹配數據源中的項目。 **第一個問題**:您確定每個StockDTO的屬性都有一個可用於標記的「空值」(=「不關心搜索中的此屬性值」)嗎? **第二個問題**:你可以考慮使用假的QueryStockDTO類作爲StockDTO的_query object_嗎?你甚至可以使用微映射器來交換它們之間的屬性。 –

+0

它實際上不一定是DTO對象。我實際上認爲現在考慮使用DTO可能不是一個好主意。是的,我可以使用某種不是DTO的Filter對象,專門用於查詢。我改變了我的問題使用StockFTOter對象而不是StockDTO – Asagohan

回答

0

我發現這個 - Creating dynamic queries with entity framework

我相信這會解決我找到庫存物品的問題。不過,如果我必須檢查每個可能需要過濾的屬性,並且必須爲每個實體DAL執行此操作,我可以看到我的方法變得非常龐大。

如果有更好的方法,請讓我知道。

Expression<Func<T, bool>> 

是通用存儲庫模式的權利?就最佳實踐和代碼解耦/可維護性而言,這是否比給定鏈接中的解決方案更好?

+0

只是一個問題:如果您使用原始表達式,那麼您將查詢方法「公開」給客戶端,而這可能不是讓LINQ優化查詢本身的最佳選擇。 –