Linq聚合延迟执行导致查询分配

时间:2014-01-12 09:30:36

标签: c# linq asp.net-mvc-4

我有一个linq查询,它正在对db上下文实体进行聚合。

var filterRange = from row in db.Venues
                       group row by true into r
                       select new
                       {
                           minRent = r.Min(x => x.Rent),
                           maxRent = r.Max(x => x.Rent),
                           minCapacity = r.Min(x => x.Capacity),
                           maxCapacity = r.Max(x => x.Capacity)
                       };

 ViewBag.mr = filterRange.Select(x => x.minRent);
 ViewBag.xr = filterRange.Select(x => x.maxRent);

在razor渲染期间,mr和viewr中的xr具有查询而不是值。

查看

<input type="hidden" id="mr" name="mr" value="@(ViewBag.mr)" />

要让viewbag包含值,需要做些什么?

2 个答案:

答案 0 :(得分:2)

首先(为了避免迭代相同的序列两次),你应该从一般查询中“实现”结果集:

var filterRange = (from row in db.Venues
                       group row by true into r
                       select new
                       {
                           minRent = r.Min(x => x.Rent),
                           maxRent = r.Max(x => x.Rent),
                           minCapacity = r.Min(x => x.Capacity),
                           maxCapacity = r.Max(x => x.Capacity)
                       }).ToList();

接下来,您还必须从派生查询中“实现”结果集:

ViewBag.mr = filterRange.Select(x => x.minRent).ToList();
ViewBag.xr = filterRange.Select(x => x.maxRent).ToList();

这将执行一次“大”查询,然后“小”查询对获得的结果集进行操作,因此这些查询非常便宜。

答案 1 :(得分:1)

LINQ查询返回一个IEnumerable,您需要调用一些方法来枚举该列表以便评估查询。在这种情况下,您应该在每次选择呼叫后添加ToArray呼叫。