Невозможно неявно преобразовать тип «IEnumerable‹ob›» во вложенные объекты «Generic.List‹cdsworkflows›»

У меня есть следующие классы

public class cdsworkflows
{
    public string WorkflowName;
    public string ActionGroup;
}  

public class cdssystems
{
    public string cdsSystemName;
    public List<cdsmodules> listModules;
}

public class cdsmodules
{
    public string moduleName;
    public List<cdsworkflows> listWorkflows;
}

Я подталкиваю значения к вышеуказанным объектам из таблицы со всеми этими данными, как показано ниже. Я получаю сообщение об ошибке в "выбрать новый", что:

Невозможно неявно преобразовать тип System.Collections.Generic.IEnumerable<cdsworkflows> в System.Collections.Generic.List<cdsworkflows>. Существует явное преобразование (вам не хватает приведения?)

Также, если вы видите последнюю строку ActionGroup = grpWorkflows.Count().ToString(), я хочу присвоить значение, а не количество. Как это сделать.

List<cdssystems> results =
    (from SPListItem item in myItemsList
     group item by item["Systems"]
     into grp
     select new cdssystems()
     {
         cdsSystemName = grp.Key.ToString(),
         listModules =
            from item in grp
            group item by item["Modules"]
            into grpModules
            select new cdsmodules()
            {
                moduleName = grpModules.Key.ToString(),
                listWorkflows =
                    from item in grpModules
                    group item by item["Workflows"]
                    into grpWorkflows
                    select new cdsworkflows()
                    {
                        WorkflowName = grpWorkflows.Key.ToString(),
                        ActionGroup = grpWorkflows.Count().ToString()
                    }
            }
     }
    ).ToList();

person Janesh Hari    schedule 01.09.2017    source источник
comment
Что вы подразумеваете под я хочу присвоить значение, а не количество. Как это сделать.?   -  person Gilad Green    schedule 01.09.2017
comment
На самом деле у меня есть элемент [ActionGroup] в коллекции. Это в основном листовой узел. Я хочу присвоить это значение ActionGroup.   -  person Janesh Hari    schedule 01.09.2017
comment
См. обновление ответа ниже   -  person Gilad Green    schedule 01.09.2017


Ответы (1)


Классы вашей модели содержат свойства типа List<T>, но во вложенных запросах вы не добавляете ToList() к проекции, поэтому он создает IEnumerable<T> и, следовательно, ошибку:

Для listWorkflows: изменить на:

listWorkflows = (from item in grpModules
                 group item by item["Workflows"] into grpWorkflows
                 select new cdsworkflows
                 {
                    WorkflowName = grpWorkflows.Key.ToString(),
                    ActionGroup = grpWorkflows.Count().ToString()
                 }).ToList()

Та же идея для cdsmodules

Что касается второй части вопроса я хочу присвоить значение, а не количество изменить:

 ActionGroup = string.Join(", ", grpWorkflows.Select(i => i["ActionGroup"]))

Также:

  1. см. соглашения об именовании C#: MSDN, dotFactory
  2. Я предлагаю, чтобы, если вы определяете свои поля как public, они были как свойства. См. это для справки: Свойства и поля: нужна помощь в понимании использования свойств над полями
person Gilad Green    schedule 01.09.2017
comment
Спасибо Гилад. Но как проецировать toList на выбор, будет ли работать ниже? (выбрать новый cdsworkflows() { WorkflowName = grpWorkflows.Key.ToString(), ActionGroup = grpWorkflows.Count().ToString() }).ToList() - person Janesh Hari; 01.09.2017
comment
Конечно, это только для POC. Да выполнит все предложения, как только начнется разработка. Большое спасибо, братан. - person Janesh Hari; 01.09.2017