c# – LINQ DynamicLibrary:如何从IQueryable中提取计数和列表

我已经开始尝试使用LINQ DynamicLibrary了.我试图用一些或只有一个动态LINQ查询替换一堆LINQ语句.我现有的静态查询如下:

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList)
{
    var output = from ticket in myList
             group ticket by ticket.Region into grouped
             orderby grouped.Count() descending
             select new TicketChartData(grouped.Key, grouped.Count(), grouped.ToList());
    return output.ToList();
}

如您所见,我的工作单元是ServiceItem.
这一切都很好,并获得了按地区分组的结果集.使用DynamicLibrary,我的尝试是能够按任何有效的动态字段进行分组(我将单独处理任何验证).所以,我尝试使用DynamicLibrary编写相同的查询,但不是很成功.这是新方法,当然不能编译:

private List<TicketChartData> GenerateImpl(IList<ServiceItem> myList, string field)
{
    IQueryable<ServiceItem> queryableList = myList.AsQueryable<ServiceItem>();
    IQueryable groupedList = queryableList.GroupBy(field,"it").
                            OrderBy("Key descending").
                            Select("new (Key as Key)"); // Not what i need
    return output.ToList();
}

我无法从分组中提取Count和List.我该怎么做呢?我花了相当多的时间寻找解决方案.如果可能的话,我希望能够避免使用Reflection.我在以下链接的前面有一些指示,但它对我的实际问题没有帮助.在此先感谢您的帮助.

System.LINQ.Dynamic: Select(” new (…)”) into a List<T> (or any other enumerable collection of <T>)

最佳答案 对于Count,它可以写成如下:

private List GenerateImpl(IList myList, string field)
{
    IQueryable queryableList = myList.AsQueryable();
    IQueryable groupedList = queryableList.GroupBy(field,"it").
                            OrderBy("Key descending").
                            Select("new (Key as Key, Count() as Count)");

    // Note: IQueryable doesn't have ToList() implementation - only IEnumerable 
    return output.ToList(); // will not work
}

对于列表 – 您可能需要将自定义实现添加到DynamicLibrary …
看看它是如何为Contains()方法here完成的

点赞