将IEnumerable转换为List的问题

时间:2016-04-05 06:58:54

标签: c# linq generics ienumerable anonymous-types

我有一个方法 GetAllReportGroups ,其中我刚刚返回一个IEnumerable但在代码审查中我被告知不,改变它!

所以现在我创造了更多的课程,我认为"这个ReportGroupMaster将是适当的返回类型,我得到了 这个错误。我不再使用IEnumerable,所以这让我感到困惑。

  

无法隐式转换类型   '&System.Collections.Generic.IEnumerable LT;> items,int Id,int SortOrder,int Type>>'至   ' System.Collections.Generic.List&#39 ;.存在显式转换(你错过了吗?   投?)

方式

public List<ReportGroupMaster> GetAllReportGroups(string language)
    {

        List<ReportGroup> reportGroups = _envyUnitOfWork.ReportGroupsAll.GetAll().ToList();
        List<ReportDefinition> reportDefinition = _envyUnitOfWork.ReportDefinitions.GetAll().ToList();
        List<TraxReport> traxReports = _envyUnitOfWork.TraxReports.GetAll().ToList();

        List<ReportGroupItem> reportGroupItems = reportGroups.Select(reportGroup => new ReportGroupItem() {Id = reportGroup.Id, ReportGroupName = reportGroup.ReportGroupName, SortOrder = reportGroup.SortOrder, Type = (int) ReportTypeNames.ReportGroup}).ToList();

        //List<ReportGroupMaster> reportGroupItems = reportGroups.Select(reportGroup => new ReportGroupMaster() {Id = reportGroup.Id, ReportGroupName = reportGroup.ReportGroupName, SortOrder = reportGroup.SortOrder, Type = (int) ReportTypeNames.ReportGroup}).ToList();




       var query = from d in reportGroupItems
                    join r in reportDefinition on d.Id equals r.ReportGroupID into items
                    join cr in traxReports on d.Id equals cr.ReportGroupID into customItems
                    orderby d.SortOrder
                    select new
                    {
                        d.ReportGroupName,
                        items = items.Select(r => new
                        {
                            r.Id,
                            r.ReportGroupName,
                            r.SortOrder,
                            r.ReportGroupID,
                            r.Type// = (int) ReportTypeNames.ReportDefinition //r.Type
                        }).Concat(customItems.Select(cr => new
                        {
                            cr.Id,
                            cr.ReportGroupName,
                            cr.SortOrder,
                            cr.ReportGroupID,
                            cr.Type// = 4 //(int) ReportTypeNames.TraxReport    //cr.Type
                        })).OrderBy(e => e.SortOrder).ToList(),
                        d.Id,
                        d.SortOrder,
                        d.Type
                    };

        return query;

    }

有什么想法吗?

ReportGroupMaster

public class ReportGroupMaster
{
    public string ReportGroupName { get; set; }
    public List<ReportGroupChild> Items { get; set; }
    public int Id { get; set; }
    public int SortOrder { get; set; }
    public int Type { get; set; }
}

ReportGroupChild

public class ReportGroupChild
{
    public int Id { get; set; }
    public string ReportGroupName { get; set; }
    public int SortOrder { get; set; }
    public int ReportGroupID { get; set; }
    public int Type { get; set; }
}

1 个答案:

答案 0 :(得分:2)

您案例中的

Linq查询会返回IEnumberable<anonymoustype>,但预期的返回类型为List<ReportGroupMaster>,这是导致错误的原因。

使用此代码。

public List<ReportGroupMaster> GetAllReportGroups(string language)
{

    List<ReportGroup> reportGroups = _envyUnitOfWork.ReportGroupsAll.GetAll().ToList();
    List<ReportDefinition> reportDefinition = _envyUnitOfWork.ReportDefinitions.GetAll().ToList();
    List<TraxReport> traxReports = _envyUnitOfWork.TraxReports.GetAll().ToList();

    List<ReportGroupItem> reportGroupItems = reportGroups.Select(reportGroup => new ReportGroupItem() {Id = reportGroup.Id, ReportGroupName = reportGroup.ReportGroupName, SortOrder = reportGroup.SortOrder, Type = (int) ReportTypeNames.ReportGroup}).ToList();

    //List<ReportGroupMaster> reportGroupItems = reportGroups.Select(reportGroup => new ReportGroupMaster() {Id = reportGroup.Id, ReportGroupName = reportGroup.ReportGroupName, SortOrder = reportGroup.SortOrder, Type = (int) ReportTypeNames.ReportGroup}).ToList();




   var query = from d in reportGroupItems
                join r in reportDefinition on d.Id equals r.ReportGroupID into items
                join cr in traxReports on d.Id equals cr.ReportGroupID into customItems
                orderby d.SortOrder
                select new ReportGroupMaster()
                {
                    ReportGroupName  =d.ReportGroupName,
                    Items  = items.Select(r => new
                    {
                        r.Id,
                        r.ReportGroupName,
                        r.SortOrder,
                        r.ReportGroupID,
                        r.Type// = (int) ReportTypeNames.ReportDefinition //r.Type
                    }).Concat(customItems.Select(cr => new
                    {
                        cr.Id,
                        cr.ReportGroupName,
                        cr.SortOrder,
                        cr.ReportGroupID,
                        cr.Type// = 4 //(int) ReportTypeNames.TraxReport    //cr.Type
                    })).OrderBy(e => e.SortOrder).ToList(),
                    Id = d.Id,
                    SortOrder  = d.SortOrder,
                    Type = d.Type
                };

    return query.ToList();

}