Ray
Ray

Reputation: 65

asp.net mvc querying from different table to view

I need to query data from 2 table

public class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Name { get; set; }
}

and

public class PrivateMessage
{
    public int MessageId { get; set; }
    public string Sender { get; set; }
    public string Receiver { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
    private DateTime _date = DateTime.Now;
    public DateTime sentDate { get { return _date; } set { _date = value; } }
}

and this what i tried on my controller

    public ActionResult Index()
    {
       var x = User.Identity.Name;
       var query = from p in db.PrivateMessages
                   join u in db.UserProfiles on p.Sender equals u.UserName
                   where p.Receiver == x
                   select new
                   {
                       u.UserName,
                       u.Name,
                       p.Receiver,
                       p.Subject,
                       p.Message,
                       p.sentDate
                   };

        return View(query);
    }

this is my view model

@model IEnumerable<SeedSimple.Models.PrivateMessage>

but i got this error

The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery1[<>f__AnonymousType95[System.String,System.String,System.String,System.String,System.DateTime]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[SeedSimple.Models.PrivateMessage]'.

all i want is to get username and name from UserProfile table and receiver, subject, message and sentDate on PrivateMessage table

Upvotes: 0

Views: 104

Answers (1)

Dimitar Dimitrov
Dimitar Dimitrov

Reputation: 15148

Well you're passing as a Model an anonymous type yet you have a strongly typed View. You can either create a new ViewModel that contains all the fields you're using for your query and pass that, or you can pass all the properties in the ViewBag (not a pretty solution).

EDIT

Thought I'd give you an example. Here is a ViewModel containing the data you need:

public class MessageViewModel
{
    public string   UserName    { get; set; }
    public string   Name        { get; set; }
    public string   Receiver    { get; set; }
    public string   Subject     { get; set; }
    public string   Message     { get; set; }
    public DateTime SentDate    { get; set; }
}

In your view:

@model IEnumerable<SeedSimple.Models.MessageViewModel>

In your Controller:

public ActionResult Index()
{
    var x = User.Identity.Name;
    var result = from p in db.PrivateMessages
                join u in db.UserProfiles on p.Sender equals u.UserName
                where p.Receiver == x
                select new MessageViewModel
                {
                    UserName    = u.UserName,
                    Name        = u.Name,
                    Receiver    = p.Receiver,
                    Subject     = p.Subject,
                    Message     = p.Message,
                    SentDate    = p.sentDate
                };

    return View(result);
}

I hope this helps.

Upvotes: 1

Related Questions