如何使用Dynamic LINQ使用GroupBy

我正在尝试使用动态LINQ进行GroupBy,但无法使其工作。

这是一些说明问题的示例代码:

List listAlbums = new List(); for (int i = 0; i < 5000; i++) { dtoMyAlbum album = new dtoMyAlbum { Author = "My Author", BookID = i, CurrSymbol = "USD", Price = 23.23, Shop = i % 3 == 0 ? "TESCO" : "HMV" }; listAlbums.Add(album); } IQueryable mydata = listAlbums.AsQueryable(); int count = mydata.Count(); //var mydataGrouped = mydata.GroupBy(a => a.Shop); // <-- this works well (but is not dynamic....) var mydataGrouped = mydata.GroupBy("Shop"); // <-- does not compile but is kind of what I want... foreach (var group in mydataGrouped) { //count = group.Count(); } 

我意识到我在GroupBy重载中缺少’elementSelector’,但我想做的就是最终得到(在这种情况下)两组dtoMyAlbum对象,所以我希望为所有集合选择所有元素……

我怎么会这样呢?

它有默认定义,你可以用它来返回匹配的元素:

 var mydataGrouped = mydata.GroupBy("Shop", "it"); 

要迭代结果,您还应该Select元素来命名它并使用dynamic s:

 var mydataGrouped = mydata.GroupBy("Shop", "it").Select("new (it.Key as Shop, it as Albums)"); foreach (dynamic group in mydataGrouped) { foreach (dynamic album in group.Albums) { Console.WriteLine(album.Author); } } 

您可以通过表达式动态构建组,也可以尝试在ScottGu的页面上显示的Dynamic LINQ库:
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

这是我从DynamicQuery复制的方法:

 public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, params object[] values) {..} 

在我的例子中,我提供了keySelectorelementSelector

listAlbums.AsQueryable().GroupBy("it.Shop", "it").Select("Author"); You can use new with listAlbums.AsQueryable().GroupBy("it.Shop", "it").Select("Author"); You can use new with GroupBy, listAlbums.AsQueryable().GroupBy("it.Shop", "it").Select("Author"); You can use new with select用于新类型。

在OOP 类中是这样的。