2010-03-15 106 views
3

我想知道如何以最佳方式解決這個問題,因爲我現在擁有的偉大工程在我看來,一個硬編碼列 - 我不知道我怎麼可以擴展它以允許列是動態的。動態LINQ GROUP BY查詢在ASP.NET MVC

控制器:

var dc = new DataContextDC(); 
return View(dc.items.Where(i=>i.IsPublic == true)); 

VIEW:

<% foreach (var grp in Model.GroupBy(s => s.GroupColumn)) { %> 
    <%= Html.Encode(grp.Key) %> 
    <% foreach (var item in grp) { %> 
     <%= Html.Encode(item.Title) %> 
    <% } %> 
<% } %> 

如前所述,目的是讓用戶選擇哪一列代替上述 「GroupColumn」。我想避免添加任何外部庫等

我看到使用反射(慢,但完全動態的),或者,因爲這是我的應用程序一個看法,我只是重複上面的代碼爲數據庫中的每個列然後放一個switch語句就可以了(快,髒,但有效)

回答

4

這可能是你會想的那種東西使用C#Linq示例中包含的Linq Dynamic Query庫。這樣一來,你可以這樣寫查詢:

var groups = Model.GroupBy("SomeColumn, SomeOtherColumn") 

...這是一個偉大的交易更容易,如果你接受來自用戶的列名管理 - 很有可能你已是列名字符串,這個庫會自動將它們解析爲lambda表達式。 (如果您期望輸入無效的可能性,您需要趕上ParseException)。

要格式化密鑰,可以直接將它傳遞給Html.Encode方法,因爲其默認字符串表示形式類似於{ ID = 1, Name = Test }。如果這足夠好,那麼我會放棄它,否則你將不得不使用反射來解析出各個關鍵屬性和屬性值。

編輯:您可以使用圖書館的任何地方,如果你下載的樣本,你會看到,它只是一個源代碼文件。

+0

最佳做法是什麼?我應該分離編譯.CS文件嗎?還是應該將它包含在我自己的項目中? – Nate

+1

@Nate Bross:沒有具體的最佳做法;如果您預見到可能會在不同的應用程序中重用該功能,那麼將其作爲單獨的庫進行編譯(您已經有了一個'.sln'),否則這兩種方法都可行。這是MSPL,所以你基本上可以做任何你想做的事情;你唯一不能做的就是重新分配源文件本身,而不在頂部的版權線。 – Aaronaught

+0

OK,叫我傻,但我不能得到這個代碼的視圖中的工作,它在我的控制,但我無法弄清楚如何在'使用System.Linq.Dynamic'添加到視圖和'< %@導入...%>'無法正常工作,有沒有我失蹤的東西? – Nate

1
+0

這是庫生產做好準備?它可以在封閉的源代碼應用程序中使用嗎? – Nate

+1

直到您編寫測試以涵蓋您的使用場景之前,恕我直言圖書館還沒有準備好生產。 – jfar

+0

@jfar在編譯生產中使用String對象之前,是否真的編寫了測試來驗證System.String的工作原理? – Nate