簡體   English   中英

強類型的存儲庫返回類型

[英]Strongly Typed Repository Return Types

因此,最近我在Entity Framework 6中進行了很多編程工作,而對於渴望加載的某些行為感到非常惱火。

拿着它:

var customers = _db.Customers.Where(c => c.IsActive);
var customersWithOrders = _db.Customers.Include(c => c.Orders).Where(c => c.IsActive);

customers.SelectMany(c => c.Orders).DoSomething(...); // NRE
customers.SelectMany(c => c.Orders).DoSomething(...); // Works

我知道我實際上可以在EF中啟用延遲加載,但這是我要避免的事情,因為這只會將它變成Select N + 1問題。

我對此不滿意的是,即使兩個查詢的簽名本質上都是IEnumerable<Customer>但兩個查詢實際上都返回不同類型的數據。如果我要在EF之上編寫自己的存儲庫,我寧願這樣做這個:

public class CustomerRepo {
    IEnumerable<T> GetCertainCustomers<T>(...);
    IEnumerable<T> DifferentCustomerQuery<T>(...);
    IEnumerable<T> YetAnotherQuery<T>(...);
}

public class Customer {...}
public class CustomerWithOrders : Customer { public IEnumerable<Order> Orders { get; set;} }
public class CustomerWithPaymentMethods : Customer { public IEnumerable<Order> Orders { get; set;} }

像上面的事情實際上可以正常工作,在給定類型參數T的情況下,存儲庫執行正確數量的緊急加載。

我的問題是,如果您擁有超過2-3種不同的緊急加載選項,那么類型的數量將會激增,更不用說當您希望緊急加載多個關系時會發生什么!

僅供參考,以上所有代碼僅供參考,不是真實的。

如果您特別擔心null引用異常,則可以默認為您的Orders一個空集合。

例如:

public class Customer
{
    public virtual List<Order> Orders { get; set; }
    public Customer()
    {
        Orders = new List<Order>();
    }
}

加載沒有.Include(c => c.Order)意味着該集合將保持為空,但不會為null 這意味着您的示例:

customers.SelectMany(c => c.Orders).DoSomething(...);
customersWithOrders.SelectMany(c => c.Orders).DoSomething(...);

兩者都可以工作(第一個將不執行任何操作,因為集合為空)。

無論如何,您應該在適當的地方進行空檢查。 如果您的方法要求客戶下訂單, 則應檢查 定義一個僅描述對象中信息為空或不為空的類是一個壞主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM