0

我已經商業模式命名ProductOrders象下面這樣:如何從庫中返回自定義結果集?

public class Product 
{ 
    public int ProductId {get; set;} 
    public string Name {get; set;} 
} 

public class Order 
{ 
    public int OrderId{get; set;} 
    public int ProductId {get; set;} 
    ... 
} 

在我的倉庫層我想返回的產品集合放置針對每個產品訂單的數量,但我想不通的正確的方法或定製返回結果集:

public ?? GetProductsWithOrderCount() 
{ 
    var resultSet = from p in Products 
       join o in Orders on p.ProductId equals o.ProductId into grp 
       select new 
       { 
        Product = p, 
        OrdersCount = grp.Count(); // Does not work, just for demonstration 
       }; 
    return resultSet; 
} 

現在我知道我可以使用IEnumerable<object>作爲返回類型,但我在那裏我在服務層用它來把結果集。

另一種選擇是我可以創造另一種模式,並返回IEnumerable<ProductWithOrderCount>但補充說,並不代表我的系統中不必要的車型:

public class ProductWithOrderCount 
{ 
    public Product Product {get; set;} 
    public int OrdersCount {get; set;} 
} 

是否有任何其他方式做到這一點?

+0

您必須創建包含getter setter這兩個模型的viewmodel –

+0

我相信問題在於您正在使用存儲庫來返回摘要/聚合數據。該庫用於返回*聚合根目錄* - 頂層實體,然後您可以在邏輯層中編寫查詢以生成計數。 –

+0

查看模型應該在UI層,對嗎?這是在存儲庫層。 –

回答

1

這是什麼DTOs(數據傳輸對象)是,是的,它的完美合理地添加一個類來處理響應。您已經擁有的課程ProductWithOrderCount沒問題,只有我會在課程名稱的末尾添加DTO以更清楚地表明這是一個旨在容納自定義數據庫結果的課程。

0
  from p in Products 
      select new ProductWithOrderCount() 
      { 
       Product = p, 
       OrdersCount = p.Orders.Count(), 
      }; 

刪除連接並使用導航屬性。

特殊的DTO課是正確的做法。

1

我在我的應用程序中有一個非常類似的要求。這是爲了分頁,因爲我返回的對象的集合將是類似於10,15或20個項目的東西,但計數將是數百個數據庫中的完整數據庫數。看起來就像你的情況一樣,雖然返回的數字和收集數量是相同的。

我結束了創建一個通用的返回類型和它看起來像這樣,但你可以調用任何你想要的類,像EnumerableWithCount

public class PagedList<T> 
{ 
    public int TotalCount { get; set; } 
    public IEnumerable<T> Items { get; set; } 

    public PagedList(IEnumerable<T> collection, int totalCount) 
    { 
     Items = collection; 
     TotalCount = totalCount; 
    } 
} 

如果我抓住你正確地尋找什麼,你會有一個返回類型,看起來像這樣。

IEnumerable<EnumerableWithCount<Product>>

1

你的庫層是一個所有存儲抽象是隱藏的。不要讓他們泄漏到您的業務邏輯即。商業代碼不應該直接向存儲發出額外的查詢,即使它看起來非常方便。這同樣適用於例外情況。如果您使用某種延遲加載,則可能會在業務層獲取數據庫級別異常,或者在演示中出現更差的風險。所以你需要完全加載你的對象樹並處理所有的DB /連接異常,或者把它們包裝成類似於StorageException的東西並拋出。

如果您的業務邏輯需要ProductsWithOrders,那麼就這樣吧 - 您需要創建另一個類ProductsWithOrders。你可以看中並創建像Ledger這樣的模板類,你可以像新的Ledger一樣使用,但我個人會等到你有另外一對類來證明它。

相關問題