使用 EF 6 访问数据库的方法?
approach for DB access with EF 6?
正在寻找使用 EF 6 访问数据库的方法。
我正在使用 .net MVC 5 并且我有以下代码:
public IEnumerable<string> GetSPSites()
{
List<string> spSites = new List<string>();
using (var context = new DevPortalDBContext())
{
var sites = context.Spsites;
foreach(var item in sites)
{
spSites.Add(item.Url);
}
}
return spSites;
}
但我想这种每次访问数据库的方法不太好。
我想知道是否有更好的方法或类似 依赖注入 的方法我可以在构造函数中执行。
请让我知道,谢谢! (* .Net 新手 *)
我的假设是 100 个用户将并行使用此代码。
如果您是为了性能,那么您的代码不完全是这样。
但这是为什么呢?
嗯,问得好。
首先,EF 正在加载整个 table 中的所有项目,而我们实际上只使用 Spsites.Url。那么我们可以做些什么来改善这种行为呢?
我们可以使用 Linq(但您应该确保您使用的是 IQueryable 而不是 IEnumerable,这可能需要付出代价)
public IEnumerable<string> GetSPSites()
{
return context.Spsites.Select(x => x.Url).ToList();
}
好的,既然我们只是在加载所需的数据,我们是否可以做一些其他事情来提高吞吐量?
是的!我们可以使用异步代码 async/await.
public async Task<IEnumerable<string>> GetSPSites()
{
return await context.Spsites.Select(x => x.Url).ToListAsync();
}
但是这个神奇的 await 有什么作用呢?
好吧,在较低的层次上,您正在通过电线与服务器对话。同步代码所做的是等待响应。这意味着,当前线程会一直休眠,直到 sql 服务器的响应到来,我们不想这样做,因为线程在性能和吞吐量方面非常昂贵。
await 以这种方式在幕后更改您的代码,您当前的线程可以在等待来自 sql 服务器的响应时执行其他工作负载(如服务其他请求)。
但要小心:有些事情你应该注意。其中之一是,您必须一直切换到异步编程,直到程序的 "root" 才能提高程序的性能。
正在寻找使用 EF 6 访问数据库的方法。 我正在使用 .net MVC 5 并且我有以下代码:
public IEnumerable<string> GetSPSites()
{
List<string> spSites = new List<string>();
using (var context = new DevPortalDBContext())
{
var sites = context.Spsites;
foreach(var item in sites)
{
spSites.Add(item.Url);
}
}
return spSites;
}
但我想这种每次访问数据库的方法不太好。 我想知道是否有更好的方法或类似 依赖注入 的方法我可以在构造函数中执行。 请让我知道,谢谢! (* .Net 新手 *)
我的假设是 100 个用户将并行使用此代码。
如果您是为了性能,那么您的代码不完全是这样。
但这是为什么呢?
嗯,问得好。
首先,EF 正在加载整个 table 中的所有项目,而我们实际上只使用 Spsites.Url。那么我们可以做些什么来改善这种行为呢?
我们可以使用 Linq(但您应该确保您使用的是 IQueryable 而不是 IEnumerable,这可能需要付出代价)
public IEnumerable<string> GetSPSites()
{
return context.Spsites.Select(x => x.Url).ToList();
}
好的,既然我们只是在加载所需的数据,我们是否可以做一些其他事情来提高吞吐量? 是的!我们可以使用异步代码 async/await.
public async Task<IEnumerable<string>> GetSPSites()
{
return await context.Spsites.Select(x => x.Url).ToListAsync();
}
但是这个神奇的 await 有什么作用呢?
好吧,在较低的层次上,您正在通过电线与服务器对话。同步代码所做的是等待响应。这意味着,当前线程会一直休眠,直到 sql 服务器的响应到来,我们不想这样做,因为线程在性能和吞吐量方面非常昂贵。
await 以这种方式在幕后更改您的代码,您当前的线程可以在等待来自 sql 服务器的响应时执行其他工作负载(如服务其他请求)。
但要小心:有些事情你应该注意。其中之一是,您必须一直切换到异步编程,直到程序的 "root" 才能提高程序的性能。