1.查詢 private?static?void?FindGreatBarrierReef() { using?(var?context?=?new?BreakAwayContext()) { var?query?=?from?d?in?context.Destinations where?d.Name?==?"Great?Barrier?Reef" select?d; var?reef?=?query.SingleOrDefault(); if?(reef?==?null) { Console.WriteLine("Can't?find?the?reef!"); } else { Console.WriteLine(reef.Description); } } } 2.需要記住的非常重要的是:所有的面向DbSet的查詢都是從數據庫中查找數據 One?important?thing?to?remember?is?that?LINQ?queries?against?a?DbSet?always?send?a query?to?the?database?to?find?the?data. 到目前為止通過LinQ去直接查詢DbSet,這將導致直接對數據庫發出SQL語句。 So?far?you’ve?used?LINQ?to?query?a?DbSet?directly,?which?always?results?in?a?SQL?query being?sent?to?the?database?to?load?the?data. 3.Find方法:從內存中以及數據庫中根據主鍵來查找 4.通過訪問DbSet的Local屬性可以訪問本地存儲的對象 eg: private?static?void?GetLocalDestinationCount() { using?(var?context?=?new?BreakAwayContext()) { foreach?(var?destination?in?context.Destinations) { Console.WriteLine(destination.Name); } var?count?=?context.Destinations.Local.Count;//獲取本地對象的數量 Console.WriteLine("Destinations?in?memory:?{0}",?count); } } 5.通過循環便利DbSet的某個屬性可以將數據庫中的數據加載到內存中,但是效率比較低。幸運的是DbContext?API包含了?Load方法, 這樣可以將數據庫中的數據加載到內存中去。 Fortunately?the?DbContext?API?includes?a?Load?method,?which?can?be?used?on?a DbSet?to?pull?all?the?data?from?the?database?into?memory. eg: private?static?void?GetLocalDestinationCountWithLoad() { using?(var?context?=?new?BreakAwayContext()) { context.Destinations.Load(); var?count?=?context.Destinations.Local.Count; Console.WriteLine("Destinations?in?memory:?{0}",?count); } } *注意Load方法是?IQueryable<T>?的擴展方法,所以想使用的話必須引入System.Data.Entity在這個名稱空間。6.因為?Load?是IQueryable<T>的擴展方法,我們也可以通過這個方法來加載數據到內存代替的是從dbset中獲取 eg:?Loading?results?of?a?LINQ?query?into?memory private?static?void?LoadAustralianDestinations() { using?(var?context?=?new?BreakAwayContext()) { var?query?=?from?d?in?context.Destinations where?d.Country?==?"Australia" select?d; query.Load(); var?count?=?context.Destinations.Local.Count; Console.WriteLine("Aussie?destinations?in?memory:?{0}",?count);7.執行LinQ從本地對象中進行查詢 Example?2-21.?Using?LINQ?to?query?Local private?static?void?LocalLinqQueries() { using?(var?context?=?new?BreakAwayContext()) { context.Destinations.Load();//加載數據到本地var?sortedDestinations?=?from?d?in?context.Destinations.Local orderby?d.Name select?d;//從本地數據中查詢數據?按照某些條件進行排序 Console.WriteLine("All?Destinations:");foreach?(var?destination?in?sortedDestinations) {Console.WriteLine(destination.Name); }var?aussieDestinations?=?from?d?in?context.Destinations.Local where?d.Country?==?"Australia" select?d;//從本地查找數據?加上了?某些條件 Console.WriteLine(); Console.WriteLine("Australian?Destinations:"); foreach?(var?destination?in?aussieDestinations) { Console.WriteLine(destination.Name); } }8.Querying?against?DbSet?uses?LINQ?to?Entities:查詢dbset是用的Linq?to?entities However,?querying?against?Local?uses?LINQ?to?Objects:然而查詢Local是利用Linq?to?objects 9.Local?will?raise?the?CollectionChanged?event?whenever?the?contents?of?Local?change。 Local將會發起集合變更事件,當集合內容變更時。混凝土框架必須做實體檢測嗎, 10.ObservableCollection<T>:集合內容變更時允許訂閱者訂閱事件。事件也會通知訂閱人。 eg: private?static?void?ListenToLocalChanges() { using?(var?context?=?new?BreakAwayContext()) { context.Destinations.Local .CollectionChanged?+=?(sender,?args)?=> { if?(args.NewItems?!=?null) { foreach?(Destination?item?in?args.NewItems) { Console.WriteLine("Added:?"?+?item.Name); } } if?(args.OldItems?!=?null) { foreach?(Destination?item?in?args.OldItems) { Console.WriteLine("Removed:?"?+?item.Name); } } }; context.Destinations.Load(); } } 11.查詢和一個對象相關聯的數據通常有三種方式:1懶加載?2立即加載?3按需要加載懶加載:(1).Your?POCO?class?must?be?public?and?not?sealed.PoCO類必須是public并且可以繼承。(2)The?navigation?properties?that?you?want?to?be?lazy?loaded?must?also?be?marked?as virtual?so?that?Entity?Framework?can?override?theproperties?to?include?the?lazy?loading?logic. 相關聯的實體的方法必須是virtual虛方法,這樣實體框架可以重寫這些屬性為了實現懶加載邏輯。 如果不滿足條件,那么和這個對象相關聯的其他對象就不會自動的填充值。 12.如何禁用懶加載:If?you?decide?that?lazy?loading?is?just?too?much?magic,?you?can?choose to?disable?it?altogether?by?using?the?DbContext.Configuration.LazyLoa dingEnabled?property. 13.通過Include來立即加載關聯數據 eg: private?static?void?TestEagerLoading() { using?(var?context?=?new?BreakAwayContext()) {var?allDestinations?=?context.Destinations.Include(d?=>?d.Lodgings);//查詢Destination的時候關聯查詢Lodgingsforeach?(var?destination?in?allDestinations){Console.WriteLine(destination.Name);foreach?(var?lodging?in?destination.Lodgings){Console.WriteLine("?-?"?+?lodging.Name);}} } 14.多關聯查詢數據 eg:級聯查詢 What?if?you?want?to?query?for?Destinations and?include?Lodgings?and?also?the?PrimaryContact?for?each?of?the?related?Lodging?instances? context.Destinations .Include(d?=>?d.Lodgings.Select(l?=>?l.PrimaryContact)) eg:這個類和多個類關聯 context.Lodgings .Include(l?=>?l.PrimaryContact) .Include(l?=>?l.SecondaryContact)15.明確加載1)明確加載是通過DbContext.Entry?方法來實現的,這個Entry方法告訴你與實體相關的所有的信息。網站框架有哪些。2)通過這個方法不僅能夠獲取到實體的值的屬性,而且可以獲取實體狀態以及原始值信息。3)這個類還提供了獲取相關關系的方法。eg:private?static?void?TestExplicitLoading() { using?(var?context?=?new?BreakAwayContext()) { var?query?=?from?d?in?context.Destinations where?d.Name?==?"Grand?Canyon" select?d; var?canyon?=?query.Single();//IQueryable context.Entry(canyon)//獲取實體 .Collection(d?=>?d.Lodgings)//Collection?and?Reference?通過lambda?表達式來指定要加載數據的。 .Load();//明確要查詢的關聯數據 Console.WriteLine("Grand?Canyon?Lodging:"); foreach?(var?lodging?in?canyon.Lodgings) { Console.WriteLine(lodging.Name); } } } 16?明確加載,加載相關對象時通過某些條件來加載 eg: private?static?void?QueryLodgingDistance() { using?(var?context?=?new?BreakAwayContext()) { var?canyonQuery?=?from?d?in?context.Destinations where?d.Name?==?"Grand?Canyon" select?d; var?canyon?=?canyonQuery.Single();var?lodgingQuery?=?context.Entry(canyon) .Collection(d?=>?d.Lodgings) .Query();//在這里創建一個查詢var?distanceQuery?=?from?l?in?lodgingQuery where?l.MilesFromNearestAirport?<=?10//將條件加入的查詢的條件中去 select?l;foreach?(var?lodging?in?distanceQuery) { Console.WriteLine(lodging.Name); }var?lodgingCount?=?distanceQuery.Count();//直接獲取數量} }context.Entry(canyon) .Collection(d?=>?d.Lodgings) .Query() .Where(l?=>?l.Name.Contains("Hotel"))//查詢相關的條件 .Load();//然后Load