2009-10-18 3 views
1

Я пытаюсь передать класс с настраиваемой формой в представление, но у меня есть немного беда.Невозможно неявно преобразовать тип 'System.Linq.IQueryable <Project.Models.TaskTimeLine>' в 'Project.Models.TaskTimeLine'

Это ошибка, которую я получаю.

Невозможно неявно преобразовать тип 'System.Linq.IQueryable' в 'Project.Models.TaskTimeLine'. Явное преобразование существует (вы пропускаете листинг?)

Это первый раз, когда я добавила список в класс и пытаюсь передать его как-то так.

Вот определение класса

public class TaskTimeLine 
    { 
    public Task task { get; set; } // to hold a single object 
    public List<DateTime> scheduledDateTime { get; set; } // to hold a collection of date times.. 

    } 

Действие контроллера по линии этого.

[Authorize] 
    public ActionResult Details2(int id) 
    { 
     TaskTimeLine task = new TaskTimeLine(); //create new instance of TaskTimeLine 
     task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id); 

     if (task == null) 
      return View("NotFound"); 
     else 
      return View("Details", task); 
    } 

Все нормально, до сих пор, поэтому я предполагаю, что здесь что-то не так.

public IQueryable<TaskTimeLine> GetTaskAndTimeLine(int taskId) 
    { 
     TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object 
     taskTimeLine.scheduledDateTime = new List<DateTime>(); instanciate list object inside   
     taskTimeLine.task = db.Tasks.SingleOrDefault(d => d.id == taskId); read the record to fill the single task object 


     /// Lots of logic is performed here to add loads of date records to the list object. 

     /// If I add a break point and check the list I can see that all the date items have gone fine into the collection   


     return (IQueryable<TaskTimeLine>)taskTimeLine; 
    } 

Единственная причина, по которой у меня так много нечетных бросков в местах, потому что казалось, что они помогли скомпилировать программу. В настоящее время он не компилируется, но я это сделал, но при выполнении фактического запроса он не работает, с тем же сообщением об ошибке.

Может ли кто-нибудь помочь, а также, возможно, добавить более полезное название для будущих людей, которые застряли в этом.

ответ

8

taskTimeLine - TaskTimeLine; почему это также будет IQueryable<TaskTimeLine>?

TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object 
    .... 
    return (IQueryable<TaskTimeLine>)taskTimeLine; 

IQueryable<T> относится к источников данных - не экземпляры самих данных (возможно, за исключением: Enumerable.AsQueryable()).

Я подозреваю, что ваш метод GetTaskAndTimeLine должен просто вернуть TaskTimeLine; и потерять много слепков ...

public TaskTimeLine GetTaskAndTimeLine(int taskId) 
{ 
    TaskTimeLine taskTimeLine = new TaskTimeLine(); // create new main object 
    ...[snip] 
    return taskTimeLine; 
} 
... 
TaskTimeLine task = taskRepository.GetTaskAndTimeLine(id); 
+1

ах, поэтому я вроде как вижу, потому что я возвращаю только один объект, а не набор объектов, он не обязательно должен быть IQueryable. Коллекция находится в списке, и это нужно повторить. Имеет ли это смысл? Во всяком случае, спасибо за направление. –

1

В методе Details2:

TaskTimeLine task = new TaskTimeLine(); //create new instance of TaskTimeLine 
task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id); 

Здесь вы объявляете задача быть TaskTimeLine, затем пытается загрузить IQueryable<TaskTimeLine> в эту переменную. Эти типы несовместимы.

Измените метод хранилища для возврата TaskTimeLine, а не IQueryable (который будет также избавиться от проблемы литья внутри метода GetTaskAndTimeLine, который идентифицирует Marc), и удалить роли:

TaskTimeLine task = taskRepository.GetTaskAndTimeLine(id); 
4

Я имел это ошибка, и я решил это, добавив FirstOrDefault() к линии.

В этом случае, в этой строке:

task = (IQueryable<TaskTimeLine>)taskRepository.GetTaskAndTimeLine(id).FirstOrDefault();

(Это происходит потому, что IQueryable ожидает несколько объектов, и вы не можете получить некоторые объекты в один task, только если сказать ему, чтобы получить только один добавив FirstOrDefault().)

+0

спасибо '.FirstOrDefault();' решил ошибку – stom

+0

Это сработало для меня! Спасибо –

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