2017-01-06 5 views
3

У меня есть следующая функция, в которой должен возвращаться тип IEnumerable? Как мне преобразовать список в IEnumerable? и вернуть пустой IEnumerable?Как преобразовать список в IEnumerable?

public IEnumerable<SoftwareImageTestPlan> GetAssignedTestPlansForSPSI(int SoftwareProductID, int SoftwareImageID) 
{ 
    var records = _entities.tblSoftwareImageTestPlans 
     .Where(x => x.SoftwareProductID == SoftwareProductID && x.SoftwareImageID == SoftwareImageID) 
     .ToList(); 

    if (records == null) 
     return new List<SoftwareImageTestPlan>(); 
    else 
     return records; 
} 

Ошибка:

Cannot implicty convert type 'System.Collections.Generic.List<....> to System.Collections.Generic.IEnumerable<.....>.An explicit conversion exists(are you missing a cast?)

error

+4

A 'Список ' это 'IEnumerable ', поэтому вы не должны нужно что-то конвертировать. Можете ли вы дать нам полное сообщение? (с заменой ... на фактические типы). – Kenneth

+0

Kenneth - я добавил скриншот об ошибке – kemosabee

+0

Пространства имен не совпадают, поэтому они не одного типа. – Brandon

ответ

1

Проблема не в конвертацию List<T> к IEnumerable<T>. Becuase List<T> инвентарь IEnumerable<T>.

Ваша проблема в том, что общие параметры разные. Вы пытаетесь преобразовать List<T1> в IEnumerable<T2>. Где:

  • Т1 QlasrService.EntityFramework.tblSoftwareImageTestPlan
  • Т2 QlasrService.Model.SchemaModels.LAP.SoftwareImageTestPlan

Простейшее решение будет отображение (ручной или automatic). Автоматическое отображение очень просто. Добавить пакет Automapper nuget. Поместите эту строку где-то на старте приложения:

Mapper.Initialize(cfg => cfg.CreateMap<tblSoftwareImageTestPlan, SoftwareImageTestPlan>()); 

И теперь ваш метод будет выглядеть следующим образом:

public IEnumerable<SoftwareImageTestPlan> GetAssignedTestPlansForSPSI(
    int SoftwareProductID, int SoftwareImageID) 
{ 
    var testPlans = from tp in _entities.tblSoftwareImageTestPlans 
        where tp.SoftwareProductID == SoftwareProductID && tp.SoftwareImageID == SoftwareImageID 
        select tp; 

    return Mapper.Map<IEnumerable<SoftwareImageTestPlan>>(testPlans); 
} 

ПРИМЕЧАНИЕ: В коде либо records не может иметь null значение, или вы будете иметь NullReferenceException на ToList() вызова , Так что if..else блок бесполезен в любом случае.

+0

Sergey - это дает ошибку «конец тела запроса с помощью предложения select или классовое предложение', также что такое пространство имен для использования «Mapper» – kemosabee

+0

@kemosabee извините, пропустил строку 'select tp'. Теперь это хорошо. Пространство имен Mapper является 'using Automapper;' –

2

Вы возвращения двух различных типов объектов:

  • tblSoftwareImageTestPlan - Что находится в вашей Entity Framework модели
  • SoftwareImageTestPlan - Который находится в ваших моделях Qlasr Schema

Поэтому, когда вы утверждаете следующее:

return records; 

Он будет жаловаться, что records объект не относится к типу SoftwareImageTestPlan. Поэтому вам необходимо преобразовать records в новый List<SoftwareImageTestPlan>, который вы можете достичь через LINQ projection.

var records = (from entities in _entities.tblSoftwareImageTestPlans 
       where entities.SoftwareProductID equals SoftwareProductID && entities.SoftwareImageID == SoftwareImageId 
       select new SoftwareImageTestPlan 
       { 
        SoftwareProductID = entities.SoftwareProductID, 
        SoftwareImageID = entities.SoftwareImageID 
       }).ToList(); 

Вы можете использовать первоначальное заявление:

if (records == null) 
    return new List<SoftwareImageTestPlan>(); 
else 
    return records; 
+0

Darren - Можете ли вы предоставить конкретный пример того, как нужно преобразовывать записи в новый List , который вы можете достичь с помощью проекта LINQ? – kemosabee

+0

@kemosabee - Я обновил свой ответ, чтобы включить это. –

+0

Также обратите внимание, что в конце вы даже можете сделать 'return records ?? новый список (); ' – knittl

1

Проблема здесь не в том, что вам необходимо преобразовать из List в IEnumerable.

Проблема заключается в том, что вы пытаетесь конвертировать из List<tblSoftwareImageTestPlan> в IEnumerable<SoftwareImageTestPlan>

Это два совершенно разных типов, из-за типа аргумента.

Возможные решения:

  • Изменить тип возврата к IEnumerable<tblSoftwareImageTestPlan>
  • Карта объектов в SoftwareImageTestPlan проецированием tblSoftwareImageTestPlan к SoftwareImageTestPlan:

    public IEnumerable<SoftwareImageTestPlan> GetAssignedTestPlansForSPSI(int softwareProductID, int SoftwareImageID) 
    { 
        var records = _entities.tblSoftwareImageTestPlans 
              .Where(x => 
              x.SoftwareProductID == SoftwareProductID && 
              x.SoftwareImageID == SoftwareImageID) 
              .Select(x => new SoftwareTestPlan { 
              Id = Id, // example 
              ... do more mapping here 
              }) 
              .ToList(); 
    
        if (records == null) 
         return new List<SoftwareImageTestPlan>(); 
        else 
         return records; 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^