按子查询对实体分组的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)