如何使用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) {..}
在我的例子中,我提供了keySelector和elementSelector 。
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 类中是这样的。