LINQ到实体组由子查询

LINQ到实体组由子查询

问题描述:

我有以下代码:LINQ到实体组由子查询

var statements = db.statement 
       .OrderByDescending(d => d.id) 
       .Take(5) 
       .AsEnumerable() 
      .Select(d => new Statements 
          { 
           Accounts = d.statement_entry.AsEnumerable() 
            .GroupBy(b => b.currency) 
            .Select(b => 
              new Account 
               { 
                In = b.Where(l => l.amount > 0).Sum(l => l.amount), 
                Out = b.Where(l => l.amount < 0).Sum(l => l.amount), 
                Balance = b.Sum(l => l.amount), 
                Currency = b.Key 
               }).OrderBy(b => b.Currency), 
           UploadedDate = d.uploaded_date, 
           Id = d.id 
          }) 
       .ToList(); 

有没有一种方法,我可以做到这一点没有AsEnumerable()?从我所了解的AsEnumberable将导致查询返回的每个statement s发生。

或者有没有更好的方法来重构代码?

你明白错误。 AsEnumerable将使查询在本地(客户端)机器上执行。

statements = db.statement 
      .OrderByDescending(d => d.id) 
      .Take(5) 

将(SQL)服务器上执行,

客户端上的剩余部分

你为什么puttin的AsEnumerable?我想查询应该工作,即使没有(和它会做一切服务器端)

的唯一的事情是,OrderBy(b => b.Currency)后,你应该把一个.ToList()使得.Select(b => new Account物化和缓存。

+0

感谢您的回复。第一个'.AsEnurmerable'似乎是必要的,但你对第二个是正确的。添加一个'.ToList'会产生一个异常:'MySql.Data.MySqlClient.MySqlException:已经有一个与这个Connection关联的打开的DataReader,它必须先关闭。' – paulslater19 2012-07-17 09:36:43

+0

@ paulslater19可悲的是每个IQueryable提供者都与其他的不同,那么一切取决于你如何配置DBML。 – xanatos 2012-07-17 09:40:57

+0

够公平的。谢谢您的帮助。事情似乎并不缓慢。随着数据集的增加,希望仍然如此。 – paulslater19 2012-07-17 09:43:19