【问题标题】:LINQ DynamicLibrary: How to extract count and list from IQueryableLINQ DynamicLibrary:如何从 IQueryable 中提取计数和列表
【发布时间】:2011-03-03 15:27:07
【问题描述】:

我已经开始尝试使用 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。 这一切正常,让我得到一个按Region 分组的结果集。使用 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。我该怎么做呢?我花了相当多的时间寻找解决方案。如果可能的话,我希望能够避免使用反射。我在以下链接的前面有一些指示,但这对我的实际问题没有帮助。提前感谢您的帮助。

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

【问题讨论】:

    标签: c# linq linq-to-objects dynamic-linq


    【解决方案1】:

    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
    }
    

    对于 List - 您可能需要将自定义实现添加到 DynamicLibrary... 看看 Contains() 方法是如何完成的 here

    【讨论】:

    • 有用的信息。但不能解决问题。如果您仔细注意到我的查询使用 GroupBy。这是区别因素。 GroupBy 创建我们无法枚举的 dynamic 类型的对象。 GroupBy 返回 IQueryable,而其他方法:select、where、orderby 等返回 IQueryable,其中 T 属于 sourcetype。
    【解决方案2】:

    一种解决方法是使用我的产品AdaptiveLINQ提供的.QueryByCubeLINQ扩展方法。

    免责声明:我是 AdaptiveLINQ 开发人员

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-07-23
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多