2016-02-09 3 views
0

Я пытаюсь объединить две разные модели в одну модель, чтобы я мог фильтровать результаты как один список.Как наилучшим образом комбинировать результаты модели

Модель:

public partial class OverviewItems 
{ 
    // Videos and Images combined for overview 
    [NotMapped] 
    public List<dynamic> Item { get; set; } 
} 

Мой контроллер:

public ActionResult LoadItems(int skip = 0, int take = 4) 
     { 
      OverviewItems items = new OverviewItems(); 
      // get al the videos an images, order them by creaton date. Take onyly the latest videos/images combined. 

     var images = db.Images.Where(i => i != null && i.Items != null && i.Items.Count() > 0).OrderByDescending(i => i.CreatedOn).Take(take).Skip(skip) as IEnumerable<object>; 
     var videos = db.Videos.Where(v => v != null && !string.IsNullOrEmpty(v.Watch_id)).OrderByDescending(v => v.CreatedOn).Take(take).Skip(skip) as IEnumerable<object>; 

     items.Item.Add(images); 
     items.Item.Add(videos); 

     // ViewBag.Items = images.Concat(videos); 
     return PartialView("OverviewItems", items); 
    } 

видео и изображения являются Entity Framework классы с пунктами.

public partial class Videos : OverviewItems 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Required] 
    [StringLength(250, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)] 
    public string Title { get; set; } 

То же самое для модели изображений. но с течением времени с разными свойствами.

Я также попробовал ViewBag, но что dosn't работает либо потому, что видео и изображения имеют другой тип, даже если я отбрасываю их в динамический.

Какую часть я пропустил? есть ли простое решение для объединения двух наборов, чтобы я мог фильтровать/брать/пропускать элементы в одно частичное?

+0

Создать модель представления с 2 свойствами из ваших коллекций –

+0

Как? Я хотел бы объединить результаты, не создавая два разных набора элементов. – RunnicFusion

+0

Я бы также сделал db.Videos.Where (v => v! = Null &&! String.IsNullOrEmpty (v.Watch_id)). OrderByDescending (v => v.CreatedOn) .Take (take) .Skip (skip) .ToList(); 'также. Если вы используете дженерики, а не динамику, вам будет легче. –

ответ

2
public abstract class OverviewItems 
{ 
    public abstract string GetTitle(); 
} 

public class Videos : OverviewItems 
{ 
    public string videoTitle { get; set; } 
    public override string GetTitle() 
    { 
     return videoTitle; 

    } 
} 

public class Images : OverviewItems 
{ 
    public string imagesTitle { get; set; } 
    public override string GetTitle() 
    { 
     return imagesTitle; 

    } 
} 

IList<OverviewItems> items = new List<OverviewItems>(); 

var images = db.Images.Where(i => i != null && i.Items != null && i.Items.Count() > 0).OrderByDescending(i => i.CreatedOn).Take(take).Skip(skip).ToList(); 
var videos = db.Videos.Where(v => v != null && !string.IsNullOrEmpty(v.Watch_id)).OrderByDescending(v => v.CreatedOn).Take(take).Skip(skip).ToList(); 

items.Add(images); 
items.Add(videos); 

var filtredItems = items.where(i=>i.GetTitle() == "SomeTitle"); 
+0

Как вы делаете items.Add? когда я делаю это в своем собственном коде, у меня есть ошибки. Какую роль я могу использовать? Ошибка: Невозможно сравнить элементы типа 'System.Collections.Generic.ICollection – RunnicFusion

+0

Я не думаю, что вам нужно сделать актерский состав, посмотрите на обновление –

+0

Недопустимые аргументы для Add. при выполнении .FirstOrDefault внутри добавления работает, но не перерывы внутри моего PartislView (и только один элемент) – RunnicFusion

0

Try "Concat" метод

var images = db.Images.Where(i => i != null && i.Items != null && i.Items.Count() > 0).OrderByDescending(i => i.CreatedOn).Take(take).Skip(skip) as IEnumerable<object>; 

var videos = db.Videos.Where(v => v != null && !string.IsNullOrEmpty(v.Watch_id)).OrderByDescending(v => v.CreatedOn).Take(take).Skip(skip) as IEnumerable<object>; 

var combined = images.Concat(videos); 
items.Item.Add(combined); 
+0

Когда я делаю это следующее сообщение об ошибке появляется: Результаты Вид = «System.Linq.Enumerable.ConcatIterator (System.Collections.Generic.IEnumerable , System.Collections.Generic.IEnumerable )» является «метод ', но используется как «тип» – RunnicFusion