Entity framework 亚音速3使用内存的方式
我试图在亚音速3,数据集和实体框架之间做一个比较。原因是为了实习我必须明确我的选择。到目前为止,我还知道数据集以以下方式检索数据:Entity framework 亚音速3使用内存的方式,entity-framework,dataset,subsonic,subsonic3,Entity Framework,Dataset,Subsonic,Subsonic3,我试图在亚音速3,数据集和实体框架之间做一个比较。原因是为了实习我必须明确我的选择。到目前为止,我还知道数据集以以下方式检索数据: 将数据库存储到内存中 内存中数据库的查询 查询结果 实体框架(.NET 3.5版)按以下方式执行。 (使用.net 3.5是因为它需要在SharePoint 2010上工作,而由于CLR版本,此版本仅支持.net 3.5) 数据库查询 结果返回到内存中的对象中 返回的结果 到现在为止,我还没有找到一个亚音速3的方案,他们是如何做到的。 我希望你们中的一位能够帮助我这
我希望你们中的一位能够帮助我这完全取决于您使用的策略(ActiveRecord/LinqTemplates/SimpleRepository)
- ActiveRecord: 每个记录都将自己的实例保存到repo中,这将导致大型列表的高内存使用率
- LinqTemplates: 更少的内存使用,您有一个数据库实例,它保存每个表和纯数据的方案
- 简单假定 甚至更少,因为repo实例对数据库一无所知。它几乎只使用内存中的纯数据
我建议同时使用ActiveRecord和Linq模板。Linq用于查询大型列表,ActiveRecord用于编辑单个记录或小型列表(这完全取决于您使用的策略(ActiveRecord/LinqTemplates/SimpleRepository)
- ActiveRecord: 每个记录都将自己的实例保存到repo中,这将导致大型列表的高内存使用率
- LinqTemplates: 更少的内存使用,您有一个数据库实例,它保存每个表和纯数据的方案
- 简单假定 更不用说,因为repo实例对数据库一无所知,它几乎只知道内存中纯数据的使用
我建议同时使用ActiveRecord和Linq模板。Linq用于查询大型列表,ActiveRecord用于编辑单个记录或小型列表(谢谢你的回答。现在我还可以对亚音速的工作原理做一个更好的比较。我尝试了用ActiveRecords的方式喷射,但与EF相比,读取2000条记录,并将1000到5000条记录写入数据库,速度非常慢。这将帮助我更好地理解亚音速。亚音速的伟大之处在于,它可以工作非常接近数据库。在内部它总是:
创建连接,执行命令,从DataReader读取结果
。如果您注意到速度慢,可能是数据库中可以改进的东西,或者您使用了错误的亚音速方法(无需从数据库中提取产品来更新其类别:db.update().Set(x=>x.CategoryId=5)。其中(x=>x.ProductId==123)。Execute();
)。您甚至可以使用亚音速自己的查询工具或纯sql查询无法通过linq的更新进行预测的查询:该应用程序将是一个在SharePoint Intranet中工作的工作时间注册系统。谢谢您的回答。现在,我还可以更好地比较亚音速的工作原理。我尝试了jet活动eRecords是这样的,但与EF相比,它的速度非常慢,读取2000条记录,并将1000到5000条记录写入数据库。这将帮助我更好地理解亚音速。亚音速的好处是,它与数据库非常接近。在内部,它总是:创建连接,执行命令,从DataReader读取结果ode>。如果您注意到速度较慢,则可能是数据库中可以改进的内容,或者您使用了亚音速提供的错误方法(无需从数据库中提取产品来更新其类别:db.update().Set(x=>x.CategoryId=5)。其中(x=>x.ProductId==123.Execute();
)。您甚至可以使用亚音速自己的查询工具或纯sql查询无法通过linq的更新进行投影的查询:该应用程序将是一个在SharePoint Intranet中工作的工作时间注册系统
var db = new NorthwindDb();
// does not hit the database (just an expression)
// since we only need ProductId and ProductName in this example,
// there is no need to pull the entiry Product from the database.
var query = from p in db.Products
where p.CategoryId == 5
select new {p.ProductId, p.ProductName };
// executes: SELECT COUNT(*) FROM products WHERE categoryid = 5;
var count = query.Count();
// does not execute anything
var top10 = query.Take(10);
// executes: SELECT productid, productname
// FROM products WHERE categoryid = 5 LIMIT 10
// LIMIT = MySQL paging, don't know how to write that for SQLServer
// p in this example is not a product, but an anonymous type with
// only two properties (ProductName and ProductId)
foreach (var p in top10);
Console.WriteLine("ProductId {0} Name {1}", p.ProductId, p.ProductName);