Линк к сущности |Мини таблица соединения с моделью - PullRequest
1 голос
/ 13 мая 2011

Доброе время суток!

У меня есть проект MVC с запросом в контроллере:

var getPhotos = (from m in db.photos
    join n in db.comments on m.id equals n.photoid
    where n.ownerName == User.Identity.Name
    orderby n.id descending
    select new { 
        m.imgcrop, m.id, 
        n.commenterName, n.comment 
    }).Take(10);

Как передать этот запрос для просмотра модели и модели для просмотра.

Проведите весь вечер, чтобы найти примеры, но не могу. Спасибо за помощь!

ОБНОВЛЕНО Полная модель класса

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace photostorage.Models
{
    public class GlobalModel
    {
        public class PhotoViewModel
        {
            public photos Photos { get; set; }
            public profiles Profile { get; set; }
            public IQueryable<comments> Comments { get; set; }
            public IQueryable<photos> NextPrev { get; set; }
        }

        public class UserPhotoList
        {
            public IQueryable<photos> Photos { get; set; }
            public profiles Profile { get; set; }
        }

        public class UserProfileView
        {
            public IQueryable<photos> Photos { get; set; }
            public profiles Profile { get; set; }
        }

        public class GetLastComments
        {
            public IQueryable<photos> uPhoto { get; set; }
            public IQueryable<comments> uComments { get; set; }
        }
    }
}

Контроллер:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using photostorage.Models;

namespace photostorage.Controllers
{
    public class HomeController : Controller
    {
        private photostorageEntities db = new photostorageEntities();

        public ActionResult Index()
        {
            if(Request.IsAuthenticated) {
                GlobalModel.GetLastComments model = new GlobalModel.GetLastComments();
                var getPhotos = (from m in db.photos
                                    join n in db.comments on m.id equals n.photoid
                                    where n.ownerName == User.Identity.Name
                                    select new { 
                                        m.imgcrop, m.id, 
                                        n.commenterName, n.comment 
                                    }).Take(10);
                return View("Index_Auth", model);
            }else{

                ViewBag.Message = "Welcome to ASP.NET MVC!";
                return View("Index");
            }
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

В этом случае вы можете создать «модель представления», которая будет использоваться только вашим представлением, а не остальной частью вашего приложения. Примерно так:

public class CommentsViewModel
{
    public int MessageId { get; set; }
    public string ImageCrop { get; set; }
    public string CommenterName { get; set; }
    public string Comment { get; set; }
}

Затем измените ваш запрос следующим образом:

var getPhotos = (from m in db.photos
    join n in db.comments on m.id equals n.photoid
    where n.ownerName == User.Identity.Name
    orderby n.id descending
    select new CommentsViewModel { 
        ImageCrop = m.imgcrop, 
        MessageId = m.id, 
        CommenterName = n.commenterName, 
        Comment = n.comment 
    }).Take(10).ToList();

Сделайте ваше представление строго типизированным для нового класса и передайте ему данные следующим образом:

View("name_of_your_view", getPhotos);
0 голосов
/ 09 августа 2014

Если вы хотите сделать это, как у вас было:

var getPhotos = (from m in db.photos
                                join n in db.comments on m.id equals n.photoid
                                where n.ownerName == User.Identity.Name
                                select new { 
                                    m.imgcrop, m.id, 
                                    n.commenterName, n.comment 
                                }).Take(10);

На самом деле вы можете это сделать, не создавая новую "CommentsViewModel", но просто используйте то, что должно быть существующими таблицами и моделями:

var getPhotos = (from m in db.Photos
                                join n in db.Comments on m.Id equals n.PhotoId
                                where n.OwnerName == User.Identity.Name
                                select new { 
                                    ImageCrop = m.ImageCrop, 
                                    Id = m.Id, 
                                    CommenterName = n.CommenterName, 
                                    Comment = n.Comment 
                                }).Take(10);

Модели были бы похожи на эти примеры, если бы вы имели отношение внешнего ключа к Photo.Id к Comments.PhotoId:

public class Photos
{
    public int Id { get; set; }
    public string ImageCrop { get; set; }

    [ForeignKey("PhotoId")]
    public virtual Comments Comment { get; set; }
}
public class Comments
{
    public int Id { get; set; }
    public int PhotoId { get; set; }
    public string CommenterName { get; set; }
    public string OwnerName { get; set; }
    public string Comment { get; set; }
}

Только примечание: модели, которые вы отобразилив вашем вопросе не было ни одного из этих столбцов, но вы строили запрос против них.Лучше не забывать давать полную картину при обращении за помощью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...