之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库。老版本的EF主要是通过ObjectContext来操作数据库的,一看是Object打头的,自然相当庞大,方法也比较多。到了经典的4.1版本,EF小组推出了一些更简单好用的API,就是DbContext,它包括更常用的方法。看看EF小组是怎么说的,原话:
The Entity Framework 4.1 release also included another important feature, called the DbContext API. DbContext is the core of this API, which also contains other dependent classes. DbContext is a
lighter-weight version of the Entity Framework’s ObjectContext. It is
a wrapper over ObjectContext, and it exposes only those
features that Microsoft found were most commonly used by developers
working with Entity Frame-work. The DbContext also provides simpler
access to coding patterns that are more complex to achieve with the
ObjectContext. DbContext also takes care of a lot of common tasks for
you, so that you write less code to achieve the same tasks; this is
particularly true when working with Code First. Because Microsoft
recommends that you use DbContext with Code First。
继续补充下知识,看看DBContext的一些新特性:
aaarticlea/png;base64,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" alt="" />
一、EF DbContext 小试牛刀
系列文章开始的时候提示大家,必须学会且习惯使用sql Profiler(开始 - 程序 - Microsoft SQL Server 2008 - 性能工具 - Sql Server Profiler),它可以监控到ef生成的sql是什么样子的,这不仅可以帮助我们更好的学习EF的API,也可以监测写出来的EF方法效率如何。好的,废话不多说了,先上解决方案图:
本章节要操作的两个实体分别:
/// <summary>
/// 景点类
/// </summary>
[Table("Locations", Schema = "baga")] //生成的表名:baga.Locations
public class Destination
{
public Destination()
{
this.Lodgings = new List<Lodging>();
}
[Column("LocationID")]
public int DestinationId { get; set; }
[Required, Column("LocationName")]
[MaxLength()]
public string Name { get; set; }
public string Country { get; set; }
[MaxLength()]
public string Description { get; set; }
[Column(TypeName = "image")]
public byte[] Photo { get; set; }
public string TravelWarnings { get; set; }
public string ClimateInfo { get; set; } public List<Lodging> Lodgings { get; set; }
}
/// <summary>
/// 住宿类
/// </summary>
public class Lodging
{
public int LodgingId { get; set; }
[Required]
[MaxLength()]
[MinLength()]
public string Name { get; set; }
public string Owner { get; set; }
public decimal MilesFromNearestAirport { get; set; } [Column("destination_id")]
public int DestinationId { get; set; }
public Destination Destination { get; set; }
}
实体不再做过多的介绍了,上个系列讲的很详细了。实体都是通过Data Annotation配置映射的,还不是很了解Data Anntation的看这里。
程序跑起来InitializeDBWithSeedData类会添加了一些测试数据到数据库中。ok,先小试下牛刀,添加一个方法PrintAllDestinations在控制台上打印出所有景点:
/// <summary>
/// 查出所有景点
/// </summary>
private static void PrintAllDestinations()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
foreach (var destination in context.Destinations)
{
Console.WriteLine(destination.Name);
}
}
}
查出来的结果自然就是所有的景点类的名称:
Grand Canyon
Hawaii
Wine Glass Bay
Great Barrier Reef
如果按照以往手写ado的方式的话,要出来上面的结果得先select * from baga.Locations表,然后用dataTable存下结果集,再遍历dataTable才能拿到所有景点的名称;当然也可以用sqlDataReader的方式一行一行读取。随便一写就是几十行了。EF只要一行。再按照景点的名称排序下:
/// <summary>
/// 按照名称排序
/// </summary>
private static void PrintAllDestinationsSorted()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations
orderby d.Name
select d;
foreach (var destination in query)
{
Console.WriteLine(destination.Name);
}
}
}
当然,查出来的数据也就是排序了的:
Grand Canyon
Great Barrier Reef
Hawaii
Wine Glass Bay
很简单,就是普通的linq写法,当然也有C# Lambda表达式的写法(文章结尾提供的源码里有)。下面的方法使用Find方法查询数据库:
/// <summary>
/// Find方法查询数据库
/// </summary>
private static void FindDestination()
{
Console.Write("Enter id of Destination to find: ");
var id = int.Parse(Console.ReadLine());
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var destination = context.Destinations.Find(id);
if (destination == null)
{
Console.WriteLine("Destination not found!");
}
else
{
Console.WriteLine(destination.Name);
}
}
}
EF的find方法是先从内存中查询,内存中没有才查询数据库。为了演示添加一个方法:
/// <summary>
/// 测试Find方法查询内存中的数据
/// </summary>
private static void TestFindLocalData()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations
where d.Name == "Great Barrier Reef"
select d;
query.Load(); //加载名称为Great Barrier Reef的景点到内存中
Console.WriteLine(context.Destinations.Local.Count); //输出内存中的数据个数 var destination = context.Destinations.Find();
if (destination == null)
Console.WriteLine("Destination not found!");
else
Console.WriteLine(destination.Name);
}
}
先从数据库加载Name为Great Barrier Reef的景点(destinationId为4)到内存中,然后调用find方法找4号destinationId,看看sql Profiler监控到的sql:
可见,程序跑完了也只有一条查询Name是Great Barrier Reef的sql,并没有发送查询destinationId为4的sql。destinationId为4的记录就是加载到内存中Name是Great Barrier Reef的记录,很明显,Find方法查询的是内存,内存中有就用内存中的。继续,使用Single方法查询单个实体:
/// <summary>
/// 获取一个实体对象(Single)
/// </summary>
private static void FindGreatBarrierReef()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations
where d.Name == "Great Barrier Reef"
select d;
var reef = query.Single(); //差不到记录或者多条记录就报错
Console.WriteLine(reef.Description);
}
}
Single方法不太好用,不管是查不到记录还是查到多条记录都会抛错;使用SingleOrDefault方法,如果查不到记录就返回null,查到多条记录也会报错:
/// <summary>
/// 获取一个实体对象(SingleOrDefault)
/// </summary>
private static void FindGreatBarrierReef()
{
using (var context = new DbContexts.DataAccess.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);
}
}
使用sql Profiler监控到如下sql被发送到了数据库。虽然是查一条记录,但是会Select TOP 2,这是为了肯定有一条满足的记录。
SELECT TOP (2)
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName],
[Extent1].[Country] AS [Country],
[Extent1].[Description] AS [Description],
[Extent1].[Photo] AS [Photo],
[Extent1].[TravelWarnings] AS [TravelWarnings],
[Extent1].[ClimateInfo] AS [ClimateInfo]
FROM [baga].[Locations] AS [Extent1]
WHERE N'Great Barrier Reef' = [Extent1].[LocationName]
二、操作内存中的数据
不同于普通的ado.net写sql直接去库里取数据。EF还提供了从内存中取数据的方式,当然内存中的数据也是从数据库先取出来的。如上的查询写法都会发送数据到数据库查询数据,如果“Great Barrier Reef”这条数据是新标记添加但是还没插入数据库(没有调用上下文的saveChanges方法),那么如上查询都查不到数据(当然find方法是可以的,上面介绍了),需要在内存中查询(Querying Local Data)。为了演示,使用SingleOrDefault方法做个试验:
/// <summary>
/// 测试查询新标记添加但是没被插入数据库的数据
/// </summary>
private static void TestGetNewAddedData()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var destination = new DbContexts.Model.Destination
{
Name = "bingmayong",
Country = "China",
Description = "too boring~~~~~~"
};
context.Destinations.Add(destination); //标记添加新实体,还没有调用SaveChanges方法提交到数据库 var query = from d in context.Destinations
where d.Name == "bingmayong"
select d; var reef = query.SingleOrDefault(); //查询Name是刚才添加的兵马俑的对象 if (reef == null)
Console.WriteLine("Can't find the reef!");
else
Console.WriteLine(reef.Description); context.SaveChanges(); //调用SaveChanges方法,添加才会被插入数据库
}
}
输出结果:
aaarticlea/png;base64,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" alt="" />
结果显示找不到新添加的景点,但是程序跑完了,它明明在数据库里了。很明显不调用SaveChanges方法的时候,所有标记添加、删除、修改的数据都是在内存中的。SingleOrDefault方法就是直接去数据库取数据的,当然Find方法直接就可以撸出内存中的数据,内存中没有再去库里找。其他方法请自行查询官方API或者自己试验,这里不做过多演示了。继续介绍一些方法:
/// <summary>
/// 查询内存中的数据
/// </summary>
private static void GetLocalDestinationCount()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var count = context.Destinations.Local.Count;
Console.WriteLine("Destinations in memory: {0}", count);
}
}
输出结果:Destinations in memory: 0 可见并没有去查询数据库,直接查的内存中的数据。直接用sql profiler跟踪下,也没有任何查询的sql发送到数据库。测试下查询数据库的:
/// <summary>
/// 先加载数据库再查询本地数据
/// </summary>
private static void GetLocalDestinationCountAfterCheckDB()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
foreach (var destination in context.Destinations)
{
Console.WriteLine(destination.Name);
}
var count = context.Destinations.Local.Count;
Console.WriteLine("Destinations in memory: {0}", count);
}
}
这样就把所有数据都打印出来了,并且输出count值是4,正如预期,先把数据库中的值拿到Local本地,再输出count值。使用sql profiler跟踪到的sql:
SELECT
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName],
[Extent1].[Country] AS [Country],
[Extent1].[Description] AS [Description],
[Extent1].[Photo] AS [Photo],
[Extent1].[TravelWarnings] AS [TravelWarnings],
[Extent1].[ClimateInfo] AS [ClimateInfo]
FROM [baga].[Locations] AS [Extent1]
这种使用foreach遍历数据把数据加载到内存的方式有点不妥,不可能每次都先遍历把数据拿到内存中再操作,改用Load方法试试:
/// <summary>
/// Load方法把数据加载到内存
/// </summary>
private static void GetLocalDestinationCountWithLoad()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
context.Destinations.Load();
var count = context.Destinations.Local.Count;
Console.WriteLine("Destinations in memory: {0}", count);
}
}
count值一样是4,产生的sql也跟上一个方法一模一样,但是Load方法还是比较实用的。linq写法是这样的:
/// <summary>
/// Load方法把数据加载到内存(LINQ写法)
/// </summary>
private static void LoadAustralianDestinations()
{
using (var context = new DbContexts.DataAccess.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);
}
}
那么把数据加载到内存中有什么好处呢?上方法:
/// <summary>
/// 操作内存中的数据
/// </summary>
private static void LocalLinqQueries()
{
using (var context = new DbContexts.DataAccess.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);
}
}
}
先使用Load方法把Destination表的数据全部加载到内存中,然后在内存中排序并输出;再在内存中已经排序的数据里查出Country为Australia的数据。整个过程操作和输出数据多次,但是只查询了一次数据库。这就是操作内存中的数据的好处。好处归好处,但是不好的地方也很明显,操作内存中的数据,新添加、删除或者修改的数据,先前加载到内存中的数据就跟数据库里的不一致了。这里可以使用CollectionChanged事件来监控,内存中的数据增删改都会触发这个事件:
/// <summary>
/// 监控内存中数据的变化
/// </summary>
private static void ListenToLocalChanges()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
context.Destinations.Local.CollectionChanged += (sender, args) =>
{
if (args.NewItems != null)
{
foreach (DbContexts.Model.Destination item in args.NewItems)
{
Console.WriteLine("Added: " + item.Name);
}
}
if (args.OldItems != null)
{
foreach (DbContexts.Model.Destination item in args.OldItems)
{
Console.WriteLine("Removed: " + item.Name);
}
}
};
context.Destinations.Load();
}
}
在把Destination表的数据加载到内存前,监控了下CollectionChanged,打印结果是:
Added: Grand Canyon
Added: Hawaii
Added: Wine Glass Bay
Added: Great Barrier Reef
正如预期,都是添加到内存中,没有删除。实际开发中,可以多多利用CollectionChanged事件来监控内存中数据的状态。
三、加载关联表数据(Loading Related Data)
加载关联表数据就是加载主表数据的同时加载出和主表有外键关系的从表数据。项目中的表不可能都是单独的表,肯定都是存在一定主外键关系的,以往写ado的时候都是根据主表的主键去从表里查和其关联的数据,稍显笨拙。EF为提供了三种方式加载从表数据,写法不同生成的sql也不同,当然效率也不同。分别是:延迟加载、贪婪加载、显示加载:
1.延迟加载(Lazy Loading)
/// <summary>
/// 延迟加载LazyLoading
/// </summary>
private static void TestLazyLoading()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations
where d.Name == "Grand Canyon"
select d;
var canyon = query.Single();
Console.WriteLine("Grand Canyon Lodging:");
if (canyon.Lodgings != null)
{
foreach (var lodging in canyon.Lodgings)
{
Console.WriteLine(lodging.Name);
}
}
}
}
类似使用主表对象打点调用从表的方式都是延迟加载(canyon.Lodgings)。上面的方法意思就是先去主表baga.Locations表里找Name值是Grand Canyon的对象,然后去从表Lodgings表里找destination_id等于这个对象的LocationID的数据。输入结果:
Grand Canyon Lodging:
Grand Hotel
Dave's Dump
注:使用延迟加载必须标注为virtual。本例是标注Destination类里的Lodgings为virtual:
public virtual List<Lodging> Lodgings { get; set; } //virtual 延迟加载
监控到的两段sql是:
SELECT TOP (2)
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName],
[Extent1].[Country] AS [Country],
[Extent1].[Description] AS [Description],
[Extent1].[Photo] AS [Photo],
[Extent1].[TravelWarnings] AS [TravelWarnings],
[Extent1].[ClimateInfo] AS [ClimateInfo]
FROM [baga].[Locations] AS [Extent1]
WHERE N'Grand Canyon' = [Extent1].[LocationName]
exec sp_executesql N'SELECT
[Extent1].[LodgingId] AS [LodgingId],
[Extent1].[Name] AS [Name],
[Extent1].[Owner] AS [Owner],
[Extent1].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Extent1].[destination_id] AS [destination_id],
[Extent1].[PrimaryContactId] AS [PrimaryContactId],
[Extent1].[SecondaryContactId] AS [SecondaryContactId]
FROM [dbo].[Lodgings] AS [Extent1]
WHERE [Extent1].[destination_id] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
看到生成的sql就很明显的知道为何叫这种加载方式为延迟加载了吧。因为先发sql去查询主键对象,然后根据主键id去从表里查相关联的数据。以往写ado都是分两步写的,EF只需要一行。
但是延迟加载并不是那么美好,不恰当的使用会发送很多多余的sql到数据库:比如从数据库取Destioation表的50条记录遍历的时候打点调用了Lodging表的数据,这就使用了延迟加载,会发送了一条sql取50条Destination表数据,同时随着遍历会分别发送50条分别取Lodging表数据。这种情况使用join连表查询显然比延迟加载有效率的多。关闭延迟加载有两种方式:
1.去掉virtual;
2.context.Configuration.LazyLoadingEnabled =false;
2.贪婪加载(Eager Loading)
/// <summary>
/// 贪婪加载EagerLoading
/// </summary>
private static void TestEagerLoading()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var allDestinations = context.Destinations.Include(d => d.Lodgings);
foreach (var destination in allDestinations)
{
Console.WriteLine(destination.Name);
foreach (var lodging in destination.Lodgings)
{
Console.WriteLine(" - " + lodging.Name);
}
}
}
}
很明显,使用了Include,加载Destination主表的所有数据并贪婪加载出了所有相关联的从表数据。输出结果:
Grand Canyon
- Grand Hotel
- Dave's Dump
Hawaii
Wine Glass Bay
Great Barrier Reef
只有一条sql被发送到了数据库:
SELECT
[Project1].[LocationID] AS [LocationID],
[Project1].[LocationName] AS [LocationName],
[Project1].[Country] AS [Country],
[Project1].[Description] AS [Description],
[Project1].[Photo] AS [Photo],
[Project1].[TravelWarnings] AS [TravelWarnings],
[Project1].[ClimateInfo] AS [ClimateInfo],
[Project1].[C1] AS [C1],
[Project1].[LodgingId] AS [LodgingId],
[Project1].[Name] AS [Name],
[Project1].[Owner] AS [Owner],
[Project1].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Project1].[destination_id] AS [destination_id],
[Project1].[PrimaryContactId] AS [PrimaryContactId],
[Project1].[SecondaryContactId] AS [SecondaryContactId]
FROM ( SELECT
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName],
[Extent1].[Country] AS [Country],
[Extent1].[Description] AS [Description],
[Extent1].[Photo] AS [Photo],
[Extent1].[TravelWarnings] AS [TravelWarnings],
[Extent1].[ClimateInfo] AS [ClimateInfo],
[Extent2].[LodgingId] AS [LodgingId],
[Extent2].[Name] AS [Name],
[Extent2].[Owner] AS [Owner],
[Extent2].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Extent2].[destination_id] AS [destination_id],
[Extent2].[PrimaryContactId] AS [PrimaryContactId],
[Extent2].[SecondaryContactId] AS [SecondaryContactId],
CASE WHEN ([Extent2].[LodgingId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [baga].[Locations] AS [Extent1]
LEFT OUTER JOIN [dbo].[Lodgings] AS [Extent2] ON [Extent1].[LocationID] = [Extent2].[destination_id]
) AS [Project1]
ORDER BY [Project1].[LocationID] ASC, [Project1].[C1] ASC
大家可能注意到了,上面的方法遍历的时候好像也使用了延迟加载(destination.Lodgings),但是按照上面关闭延迟加载的方法去掉virtual,跑下程序结果还是一样也能拿到从表数据,为何?我猜测是上面的Include方法已经拿到了主表和从表的所有数据(参考上面生成的sql),这个时候再.Lodgings就是从内存中拿的从表数据了,并未去数据库查询。
贪婪加载是很灵活的,可以写下如下贪婪加载,具体请自行调试和跟踪:
var AustraliaDestination = context.Destinations.Include(d => d.Lodgings).Where(d => d.Country == "Australia");
context.Lodgings.Include(l => l.PrimaryContact.Photo);
context.Destinations.Include(d => d.Lodgings.Select(l => l.PrimaryContact));
context.Lodgings.Include(l => l.PrimaryContact).Include(l => l.SecondaryContact);
当然贪婪加载也有它不好的地方:看上面生成的sql自然就知道了,虽然贪婪加载生成的sql不多只有一条,但是随着我们贪婪加载的从表越多,生成的join也就越复杂,迟早有一个连自己都看不懂的嵌套join查询摆在面前让你崩溃。当然越复杂也就越耗费性能,这是明显的。
3.显示加载(Explicit Loading)
/// <summary>
/// 显示加载ExplicitLoading
/// </summary>
private static void TestExplicitLoading()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var query = from d in context.Destinations
where d.Name == "Grand Canyon"
select d; var canyon = query.Single();
context.Entry(canyon).Collection(d => d.Lodgings).Load();
Console.WriteLine("Grand Canyon Lodging:");
foreach (var lodging in canyon.Lodgings)
{
Console.WriteLine(lodging.Name);
}
}
}
跟延迟加载一样,主表从表数据分开加载,但是显示加载又几个好处:不需要标记virtual了;生成的sql更加清晰明白。跟踪到的sql:
SELECT TOP (2)
[Extent1].[LocationID] AS [LocationID],
[Extent1].[LocationName] AS [LocationName],
[Extent1].[Country] AS [Country],
[Extent1].[Description] AS [Description],
[Extent1].[Photo] AS [Photo],
[Extent1].[TravelWarnings] AS [TravelWarnings],
[Extent1].[ClimateInfo] AS [ClimateInfo]
FROM [baga].[Locations] AS [Extent1]
WHERE N'Grand Canyon' = [Extent1].[LocationName]
exec sp_executesql N'SELECT
[Extent1].[LodgingId] AS [LodgingId],
[Extent1].[Name] AS [Name],
[Extent1].[Owner] AS [Owner],
[Extent1].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Extent1].[destination_id] AS [destination_id],
[Extent1].[PrimaryContactId] AS [PrimaryContactId],
[Extent1].[SecondaryContactId] AS [SecondaryContactId]
FROM [dbo].[Lodgings] AS [Extent1]
WHERE [Extent1].[destination_id] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
两条查询,先查主表,再查出从表数据。其实生成的sql和查出来的结果都和延迟加载一模一样,我个人更喜欢显示加载。结果:
Grand Canyon Lodging:
Grand Hotel
Dave's Dump
大家可能注意到了,显示加载使用的是Entry方法,贪婪加载是Include。Entry方法中文意思为“进入”,通俗点理解就是先进入一个实体,然后打点调用各种方法。Entry配合使用Reference和Collection方法,分别是查询单个实例和整个集合的数据。下面是一条查询单个实例的方法:
var lodging = context.Lodgings.First();
context.Entry(lodging).Reference(l => l.PrimaryContact).Load();
当然也可以使用IsLoaded方法判断相关联的从表数据是否已经从数据库加载出来了:
/// <summary>
/// IsLoaded方法判断数据是否加载
/// </summary>
private static void TestIsLoaded()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var canyon = (from d in context.Destinations
where d.Name == "Grand Canyon"
select d).Single(); var entry = context.Entry(canyon);
Console.WriteLine("Before Load: {0}", entry.Collection(d => d.Lodgings).IsLoaded); entry.Collection(d => d.Lodgings).Load();
Console.WriteLine("After Load: {0}", entry.Collection(d => d.Lodgings).IsLoaded);
}
}
输出结果:
Before Load: False
After Load: True
IsLoaded方法有何意义呢?官方给出的解释:
If you are performing an explicit load, and the contents of the navigation property may
have already been loaded, you can use the IsLoaded flag to determine if the load is
required or not.
意思就是:IsLoaded方法判断从表数据是否已经加载了。很明显,适当使用IsLoaded方法也可以提高写EF方法的效率。
如上的各种加载方式等都是通过EF或者linq的形式把数据加载到了内存中,然后再进行排序,筛选等操作,最后展示到界面上的。来看一个方法:
/// <summary>
/// 在内存中操作
/// </summary>
private static void QueryLodgingDistance()
{
using (var context = new DbContexts.DataAccess.BreakAwayContext())
{
var canyonQuery = from d in context.Destinations
where d.Name == "Grand Canyon"
select d;
var canyon = canyonQuery.Single();
var distanceQuery = from l in canyon.Lodgings
where l.MilesFromNearestAirport <=
select l;
foreach (var lodging in distanceQuery)
{
Console.WriteLine(lodging.Name);
}
}
}
这个方法很简单,意思就是先查出Name为Grand Canyon的Destination,然后去查出从表Lodging里距离最近机场不到10公里的住宿的地方,最后遍历输出。很明显使用了延迟加载(canyon.Lodgings),生成的sql:
exec sp_executesql N'SELECT
[Extent1].[LodgingId] AS [LodgingId],
[Extent1].[Name] AS [Name],
[Extent1].[Owner] AS [Owner],
[Extent1].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Extent1].[destination_id] AS [destination_id],
[Extent1].[PrimaryContactId] AS [PrimaryContactId],
[Extent1].[SecondaryContactId] AS [SecondaryContactId]
FROM [dbo].[Lodgings] AS [Extent1]
WHERE [Extent1].[destination_id] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
我只需要查出Grand Canyon附近距离机场不到10公里住宿的地方,而上面的sql把Grand Canyon附近所有住宿的地方都加载到了内存中,然后在内存中做筛选的,自然不符合性能的要求,修改为:
/// <summary>
/// 改进:在数据库中操作
/// </summary>
private static void QueryLodgingDistancePro()
{
using (var context = new DbContexts.DataAccess.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 <=
select l;
foreach (var lodging in distanceQuery)
{
Console.WriteLine(lodging.Name);
}
}
}
有什么区别呢?认真看肯定看的出来了,使用了Query方法,查询操作是在数据库操作的,而不是加载到了内存中再筛选的。看看生成的sql:
exec sp_executesql N'SELECT
[Extent1].[LodgingId] AS [LodgingId],
[Extent1].[Name] AS [Name],
[Extent1].[Owner] AS [Owner],
[Extent1].[MilesFromNearestAirport] AS [MilesFromNearestAirport],
[Extent1].[destination_id] AS [destination_id],
[Extent1].[PrimaryContactId] AS [PrimaryContactId],
[Extent1].[SecondaryContactId] AS [SecondaryContactId]
FROM [dbo].[Lodgings] AS [Extent1]
WHERE ([Extent1].[destination_id] = @EntityKeyValue1) AND ([Extent1].[MilesFromNearestAirport] <= cast(10 as decimal(18)))',N'@EntityKeyValue1 int',@EntityKeyValue1=1
看看这条sql,小于等于10作为查询条件了,查出来的数据自然就是满足要求的数据了,这样就只会加载需要的数据到内存中,这就是效率的问题,认真研究EF的API之后,写程序的时候自然就知道对应生成的sql是什么样子的,复不复杂、会有什么性能上的损失。Perfect。再举一例:
/// <summary>
/// 查询个数
/// </summary>
private static void QueryLodgingCount()
{
using (var context = new DbContexts.DataAccess.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 lodgingCount = lodgingQuery.Count();
Console.WriteLine("Lodging at Grand Canyon: " + lodgingCount);
}
}
从数据库中算好个数再输出,而不是把所有记录都加载到内存中,然后在内存中算个数。当然也可以一起使用Query和Load方法,先过滤好需要的数据再加载到内存中:
context.Entry(canyon).Collection(d => d.Lodgings).Query().Where(l => l.Name.Contains("Hotel")).Load();
总之,调用Load方法就会加载数据到内存中,加载之前做好过滤就是在数据库中的,加载之后再过滤就是在内存中的操作,如果只需要简单求count,显然前者更合适。
感谢阅读,本章源码。后续还有更精彩的文章带你了解EF DbContext的各种增删改查,请保持关注!