當我使用ADO.NET時,我用來創建使用連接查詢填充的TableAdapter,因此例如即使基礎選擇查詢將產品加入到位置表中,產品表適配器也會有'位置'列。LINQ查詢和Dao層應該如何向查看返回查詢?
在LINQ中,我該如何做到這一點?通過在ProductsDao類中編寫LINQ查詢來返回連接查詢中的列嗎?我返回什麼類型的綁定到gridview?重新調整LINQ結果的問題是我會認爲它會打破ProductsDao類的一致性(這應該只從數據庫返回產品行)。
當我使用ADO.NET時,我用來創建使用連接查詢填充的TableAdapter,因此例如即使基礎選擇查詢將產品加入到位置表中,產品表適配器也會有'位置'列。LINQ查詢和Dao層應該如何向查看返回查詢?
在LINQ中,我該如何做到這一點?通過在ProductsDao類中編寫LINQ查詢來返回連接查詢中的列嗎?我返回什麼類型的綁定到gridview?重新調整LINQ結果的問題是我會認爲它會打破ProductsDao類的一致性(這應該只從數據庫返回產品行)。
我認爲最好的選擇是定義代表想要返回的加入數據的類(例如ProductDetails
),然後從數據層返回IQueryable<ProductDetails>
。
要返回可查詢,你可以寫只是一個簡單的LINQ查詢:
public IQueryable<ProductDetails> GetProducts() {
return from p in db.Products
join d in db.Details on p.ID equals d.ID
select new ProductDetails { p.Name, d.Notes };
}
這種方法有幾個好處:
你不直接公開YourDataContext
對象 - 它可以留作爲DAO類的私有字段(如果它是短暫的),或者您可以根據需要創建它。
你不能直接暴露下面的LINQ實體(例如Product
或Details
),使用戶可以與您的數據庫不小心惹(除非你給他們一個辦法做到這一點)
你返回可查詢,它只是代表查詢。當用戶添加其他約束時(例如where
),查詢將被組合,您將不會加載不必要的數據。
您可以從類只露出合理功能 - 例如,如果你只有方法GetProducts
服用categoryID
,用戶只能獲取產品中的特定類別(這使得它不可能從獲取整個表數據庫)
非常感謝您的建議。那麼,在我的ProductDao類中使用這種方法還是應該是不同類的方法? – jaffa