2014-01-12 58 views
0

我有一個linq查詢正在做數據庫上下文實體的聚合。Linq聚合延遲執行導致查詢分配

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); 

在剃鬚刀渲染期間,viewbag中的mr和xr正在查詢而不是值。

查看

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

需要採取哪些措施有viewbag contaning值?

+1

請解釋_「查詢而不是值」_。你可能只想在這裏實現查詢,例如通過調用'.ToList()'或'.FirstOrDefault()'來實現,具體取決於你想要做什麼。 – CodeCaster

+0

@CodeCaster ViewBag.mr包含SELECT [GroupBy1]。[A1] AS [C1] FROM(SELECT \t [Extent1] [K1] AS [K1], \t MIN([Extent1]。[A1]) AS [A1] \t FROM(SELECT \t \t鑄造(1作爲位)AS [K1], \t \t [Extent1] [出租] AS [A1] \t \t FROM [DBO]。[地點] AS [ Extent1] \t)AS [Extent1] \t GROUP BY [K1] )AS [GroupBy1] –

+0

Then show yo你的觀點。並請解釋你想要這個查詢返回。如果您只想從整個表中選擇最小和最大租金(如此,兩個值),則應該寫一個完全不同的查詢。 – CodeCaster

回答

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(); 

這將執行'大'的查詢一次,'小'的然後對獲得的結果集進行操作,所以這些非常便宜。

+0

這一個導致ViewBag.mr有值System.Collections.Generic.List'1 [System.Decimal] –

+0

該代碼是正確的。很顯然,在某個地方(可能是隱含的)會調用ToString()。難道你的視圖的代碼做了一些奇怪的事情嗎? –

+0

我調試了控制器以查看存儲在viewbag中的內容,並確認viewbag屬性值設置爲System.Collections.Generic.List'1 [System.Decimal] –

1

LINQ查詢返回一個IEnumerable,您需要調用某個方法來枚舉該列表以評估查詢。在這種情況下,您應該在每次Select調用後添加一個ToArray調用。

+0

如果我在每次select調用之後都要調用數據庫,那麼調用db兩次?在單個查詢中進行聚合的目的是減少呼叫 –

+1

如果您在原始查詢上沒有執行類似操作,則會出現這種情況。托馬斯韋勒有正確的想法,除了你應該調用ToArray而不是ToList。我看到很多人在默認情況下調用了ToList,但是如果您需要一個通用List,則只應該調用ToList。數組比List更高效,因此默認情況下調用ToArray,如果您打算稍後添加和移除項目,則只調用ToList,這就是爲什麼您首先要在數組中使用List的原因。 – jmcilhinney