-
14-11-2019 - |
题
我试着在亚音问3,数据集和实体框架之间进行比较。对于我的实习原因,我必须明确我的选择。到目前为止,我知道DataSets与检索数据一起工作以下方式:
- db进入内存
- 在内存中的dB查询
查询的结果
实体框架(.NET版本3.5)这是以下方式。 (使用.NET 3.5,因为它需要在SharePoint 2010上工作,并且由于CLR版本而仅支持.NET 3.5)
- 在db 上查询
- 结果返回到内存中的对象
- 结果返回
直到现在我还没有找到亚音问3的方案它们是如何做到的。 我希望你们中的一个可以帮助我
解决方案
完全取决于您使用的策略(ActiveRecord / linqtemplates / simplerepository)
-
activerecord: 每一个记录都将自己的实例保存到repo中,这将导致大型列表的高内存使用情况。
-
linqtemplates: 更少的内存用法,您可以拥有DB的实例,它包含每个表和纯数据的方案。
-
simplerepository 甚至更少,因为repo实例不了解数据库。它几乎只有使用纯数据在内存中。
我会建议使用activerecord和linq模板。 LINQ用于查询大型列表,以及编辑单个记录或小列表(<100条目)的ActiveRecord。
子系统不通过设计缓存,所以我不担心。 但是关于LINQ的东西(对于所有三种策略)的伟大事物是你没有击中数据库,直到您需要数据,因此您可以控制您使用的内存。
示例:
.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);
更新: 我不知道您正在开发哪种应用程序,但如果您需要在DataGrid中显示数据,我会建议使用Devexpress XtraGrid(可用于WinForms,WPF / Silverlight和ASP.NET),该XtraGrid具有具有适应性的ServerMode的ServerMode使用子系统的linqTemplates(因为它可以绑定到IEquerable,并且自身处理IQuerable上的分页/排序/过滤,并且一次只需要几个记录。 大大减少了内存足迹和我们应用的加载性能(将一堆记录加载到DataTable中)。