按子查询对实体分组的linq

按子查询对实体分组的linq,linq,linq-to-entities,group-by,subquery,Linq,Linq To Entities,Group By,Subquery,我有以下代码: var statements = db.statement .OrderByDescending(d => d.id) .Take(5) .AsEnumerable() .Select(d => new Statements {

我有以下代码:

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();
var语句=db.statement
.OrderByDescending(d=>d.id)
.采取(5)
.可计算的()
.Select(d=>new语句
{
Accounts=d.statement\u entry.AsEnumerable()
.GroupBy(b=>b.currency)
.选择(b=>
新帐户
{
In=b.其中(l=>l.amount>0).和(l=>l.amount),
Out=b,其中(l=>l.amount<0)。总和(l=>l.amount),
余额=b.总和(l=>l.金额),
货币=b.键
}).OrderBy(b=>b.Currency),
UploadeDate=d.uploaded\u日期,
Id=d.Id
})
.ToList();
有没有办法不用
AsEnumerable()
?据我所知,
AsEnumberable
将导致对返回的每个
语句进行查询


还是有更好的方法来重构代码

你理解错了
AsEnumerable
将使查询在本地(客户端)计算机上执行

这个

将在(SQL)服务器上执行

客户机上的其余部分

为什么要将
设置为可计算的
?我认为即使没有查询,查询也应该可以工作(它可以在服务器端完成所有工作)


唯一的问题是,在
OrderBy(b=>b.Currency)
之后,您应该放置一个
.ToList()
,以便
选择(b=>新帐户将被物化并缓存。

感谢您的回复。第一个
.asenumerable
似乎是必要的,但第二个是正确的。添加
.ToList
会产生一个异常:
MySql.Data.MySqlClient.MySqlException:已经有一个与此连接关联的开放数据读取器,它必须是clo首先是sed。
@paulslater19很遗憾,每个IQueryable提供程序都不同于其他提供程序,然后一切都取决于您如何配置DBML.fair。感谢您的帮助。事情似乎运行得并不缓慢。希望随着数据集的增加,情况继续如此。
statements = db.statement
            .OrderByDescending(d => d.id)
            .Take(5)