Nick Carter
Nick Carter

Reputation: 116

How to bind custom model class in mvc

I am new in MVC. I am working on a project where i have created a model class and also context class which is working good if i view the record in normal view. but if i try to get the data in group by "Series_Name" and bind it into same model class it gives error. here is my code

Here is Model class and DBContextClass

[Table("tblvideo")]
public class TVSerial
{
    [Key]
    public Int64 Video_ID { get; set; }
    public string Series_Name { get; set; }
    public string Season_No { get; set; }
    public string Episode_No { get; set; }
    public string Episode_Name { get; set; }
    public string Time_Duration { get; set; }
    public string File_Url_480p { get; set; }
    public string File_Url_720p { get; set; }
    public string Description { get; set; }
    public bool Is_Active { get; set; }
    public string Image_Url_Small { get; set; }
    public string Image_Url_Big { get; set; }   
} 

public class TvSerialContext : DbContext
{
    public DbSet<TVSerial> TvSerials { get; set; }
}

Here is controller class:

public class TvSerialController : Controller
{
    public ActionResult ListAllTvSerial()
    {
        try
        {
            TvSerialContext tvContext = new TvSerialContext();
            List<TVSerial> tv = tvContext.TvSerials.ToList();
            return View(tv);
        }
        catch (Exception ex)
        {
            return Content(ex.Message);
        }
    }
}

Above code works as expected, but if i am doing this :

public ActionResult ListAllSeason(string serial)
{
    try
    {
        TvSerialContext tvContext = new TvSerialContext();
        List<TVSerial> tv = tvContext.TvSerials.Where(tvs => tvs.Series_Name == serial).Distinct().ToList();
        return View(tv);
    }
    catch (Exception ex)
    {
        return Content(ex.Message);
    }
}

it return all rows , i just want single row from every series_name and custom field "Series_Name,Season_No,Image_Url_Big" i don't know how to achieve this. getting result :enter image description here

Expected result:- enter image description here

Upvotes: 1

Views: 293

Answers (3)

user3559349
user3559349

Reputation:

You could do this by creating a view model and using a .GroupBy() clause

public class TVSerialVM
{
  public string SeriesName { get; set; }
  public string SeasonNo { get; set; }
  public string ImageUrl { get; set; } 
}

and the query to project into your view model

List<TVSerialVM> model = tvContext.TvSerials.Where(t => t.Series_Name == serial)
  .GroupBy(t => new { t.Series_Name, t.Season_No, t.Image_Url_Big })
  .Select(t => new TVSerialVM
  {
    SeriesName = t.Key.Series_Name,
    SeasonNo = t.Key.Season_No,
    ImageUrl = t.Key.Image_Url_Big
  }).ToList();

Side note: Your duplicating data in the database (the season number and the image url). You should consider moving the image urls to another table with a relationship to the season number.

Upvotes: 2

Devon Burriss
Devon Burriss

Reputation: 2532

The reason you are getting multiple values even though you are using distinct is the Distinct method does not know what "equal" is for TVSerial.

You can use Distinct with IEqualityComparer. https://msdn.microsoft.com/en-us/library/vstudio/bb338049(v=vs.100).aspx

Upvotes: 1

Jon R.
Jon R.

Reputation: 999

Distinct is not guaranteed to on custom objects it doesn't know what to compare. I have used this SO in the past to make my custom object work with Distinct.

Creating a distinct list of custom type in C#

Upvotes: 0

Related Questions