Nivya
Nivya

Reputation: 333

Take data from different tables and display it in View Index in mvc4

I have 2 tables Work_table and Employee_table.I want to display emp_id from Work_table and corresponding emp_name from Employee_table in the index view of Employee_table. my models are:

namespace MvcConQuery.Models
{
[Table("Work_Table")]
public class EnquiryModel
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public Int32 Enq_id { get; set; }
[Required]
[Display(Name="Name")]
public string CustomerName { get; set; }
[ReadOnly(true)]
public string Date
{
get
{
DateTime Date = DateTime.Now;
return Date.ToString("yyyy-MM-dd"); ;
}
set{}
}
[Required]
[Display(Name = "Region")]
public string Region { get; set; }
[Required]
[RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Entered phone number format is not valid.")]
[Display(Name = "Phone number")]
public string Ph_No { get; set; }
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email_id")]
public string Email_id { get; set; }
[Required]
[Display(Name = "Address")]
public string Address { get; set; }
[Required]
[Display(Name = "Query")]
public string Query { get; set; }
public string Referral { get; set; }
public string Feedback { get; set; }
public string Status { get; set; }
public Int32? Emp_id { get; set; }
public string FollowUpDate { get; set; }
public List<EmployeeModel> Employees { get; set; }
}}


namespace MvcConQuery.Models
{
[Table("Employee_Table")]
public class EmployeeModel
{

[Key,Column(Order=0)]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
//[ForeignKey("EnquiryModel")]
public Int32 Emp_id { get; set; }
public string Emp_Name{ get; set; }
//[Key,Column(Order=1)]
public string Region { get; set; }
//[ForeignKey("Region")]
public string Emp_PhNo { get; set; }
public string Emp_Address { get; set; }
public List<EnquiryModel> Enquires { get; set; }


}

}

How to write controller? I stucked when writing the function in controller.

public ActionResult Index()
{
} 

Please suggest a solution. thanks in advance.

Regards

Upvotes: 3

Views: 11129

Answers (2)

Aritra B
Aritra B

Reputation: 1746

I was wrong earlier, I made out from your code that there is a many -to- many relationship between Employee and Work tables. For my convenience, I have used Job as the name for your Work table / model.

I hope that you want to display a list of EmployeeIds along with the corresponding EmployeeNames in the Index View. I have added an extra property called JobName to viewmodel, you can have other properties too.

For that matter, create a ViewModel EmployeeViewModel and bind the index view of your action result with an IEnumerable<EmployeeViewModel>. The definition for EmployeeViewModel can be something like -

    public class EmployeeViewModel
    {
        public int EmployeeId { get; set; }

        public string EmployeeName  { get; set; }

        public string JobName { get; set; }

        //..Other memberVariables..
    }


Suppose these are your models -
Employee

        public class Employee
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public int EmployeeId { get; set; }

            public string EmployeeName { get; set; }

            public string Address { get; set; }

            public virtual ICollection<Job> Jobs { get; set; }
        }

And WorkTable, renamed it as Job for my own convenience

    public class Job
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int JobId { get; set; }

        public string JobName { get; set; }

        public JobCategory JobCategory { get; set; }

        public int EmployeeId { get; set; }

        public virtual ICollection<Employee> Employees { get; set; }
    }

In your Index Action, you create a result set by joining the two tables, bind it to IEnumerable<EmployeeViewModel> and pass that as a model to the view. The View should receive a model of type IEnumerable<EmployeeViewModel> as I mentioned earlier,so you need to query your entities which should be something like -

    public ActionResult Index()
    {
        //..something like this..this is IQueryable..
        //...convert this to IEnumerable and send this as the model to ..
        //..the Index View as shown below..here you are querying your own tables, 
        //.. Employee and Job,and binding the result to the EmployeeViewModel which
        //.. is passed on to the Index view.
        IEnumerable<EmployeeViewModel> model=null;
        model = (from e in db.Employees
                    join j in db.Jobs on e.EmployeeId equals j.EmployeeId
                    select new EmployeeViewModel
                    {
                        EmployeeId = e.EmployeeId,
                        EmployeeName = e.EmployeeName,
                        JobName = j.JobName
                    });

        return View(model);
    }

Your index view should be something like -

@model IEnumerable<MyApp.Models.EmployeeViewModel>

@{
    ViewBag.Title = "Index";
}


<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.EmployeeId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.EmployeeName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.JobName)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.EmployeeId)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.EmployeeName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.JobName)
        </td>
    </tr>
}

</table>

In this above solution, I have made an attempt to generate a situation similar to yours and address your concerns. I hope this brings some sort of respite to your worries and helps you move ahead. Take this as a map and try follow the routes to find your own destination/solution. Btw, sorry for this delayed reply. Hope this helps.

Upvotes: 4

mayank sahu
mayank sahu

Reputation: 9

This code has something missing select new EmployeeviewModel

model = (from e in db.Employees
                    join j in db.Jobs on e.EmployeeId equals j.EmployeeId
                    select new EmployeeViewModel
                    {
                        EmployeeId = e.EmployeeId,
                        EmployeeName = e.EmployeeName,
                        JobName = j.JobName
                    });

Upvotes: 0

Related Questions