我试着在亚音问3,数据集和实体框架之间进行比较。对于我的实习原因,我必须明确我的选择。到目前为止,我知道DataSets与检索数据一起工作以下方式:

  1. db进入内存
  2. 在内存中的dB查询 查询的结果

    实体框架(.NET版本3.5)这是以下方式。 (使用.NET 3.5,因为它需要在SharePoint 2010上工作,并且由于CLR版本而仅支持.NET 3.5)

    1. 在db 上查询
    2. 结果返回到内存中的对象
    3. 结果返回

      直到现在我还没有找到亚音问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中)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top