2012-07-17 176 views
0

我有以下代碼: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發生。

或者有沒有更好的方法來重構代碼?

回答

1

你明白錯誤。 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