0

I am a beginner to MVC and using Linq. So any help would be much appreciated.

So I have this LINQ statement to select and join my 3 tables,

OnlineRegistrationDBEntities1 dbEvents = new OnlineRegistrationDBEntities1();

var displayRegisteredEvents = (from x in dbEvents.Registers
                              join c in dbEvents.clients on x.email equals c.email
                              join e in dbEvents.events on x.eventname equals e.eventname
                              select new 
                              {
                                  fullname = c.fullname,
                                  eventname = e.eventname,
                                  email = c.email,
                                  guestnumber = x.guestnumber,
                                  payment_amount = x.payment_amount
                              });

return View(displayRegisteredEvents);

And I'm trying to display the result on an HTML table like this,

<tbody>
        @foreach (var i in Model)
        {
            <tr>
                <td>@i.fullname</td>
                <td>@i.eventname</td>
                <td>@i.email</td>
                <td>@i.guestnumber</td>
                <td>@i.payment_amount</td>
                <td>
                    <button type="button" class="modalLink btn btn-danger" data-id="@i.email" data-toggle="modal" data-target="#editModal">
                        Delete
                    </button>

                </td>
            </tr>
        }
</tbody>

However, when I run the program an error occurs saying:

'object' does not contain a definition for 'fullname'

Any idea what's wrong? Please help. Thanks a lot.

Selim Yildiz
  • 5,254
  • 6
  • 18
  • 28
jeloneedshelp
  • 143
  • 2
  • 11

1 Answers1

0

Since you are using anonymous types, from: Anonymous View Models in ASP.NET MVC Using Dynamics

The answer here lies in the fact that anonymous classes are internal by default, meaning they are only accessible to the assembly in which they were created. Once you cross that assembly boundary, it gets treated as a regular object

I suggest you that create a new POCO class then pass it to view instead of using anonymous types:

public class OnlineRegistrationViewModel
{
    public string fullname { get; set; }

    public string eventname { get; set; }

    public string email { get; set; }

    public string guestnumber { get; set; }

    public string payment_amount { get; set; }
}

And in your controller you need to return List<OnlineRegistrationViewModel>:

OnlineRegistrationDBEntities1 dbEvents = new OnlineRegistrationDBEntities1();

var displayRegisteredEvents = (from x in dbEvents.Registers
                              join c in dbEvents.clients on x.email equals c.email
                              join e in dbEvents.events on x.eventname equals e.eventname
                              select new OnlineRegistrationViewModel
                              {
                                  fullname = c.fullname,
                                  eventname = e.eventname,
                                  email = c.email,
                                  guestnumber = x.guestnumber,
                                  payment_amount = x.payment_amount
                              }).ToList();

return View(displayRegisteredEvents);

In your view you need to declare Model:

@model List<OnlineRegistrationViewModel> 

See these references:

Selim Yildiz
  • 5,254
  • 6
  • 18
  • 28