混凝土框架必須做實體檢測嗎,實體框架查詢

 2023-10-18 阅读 29 评论 0

摘要: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(); i
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

轉載于:https://www.cnblogs.com/feidaochuanqing/p/3398325.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/147784.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息