[英]How to handle a strongly typed modal in a strongly typed view with different types
[英]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.