ASP.NET MVC Проблемы с получением данных и связанных данных для представления.(Посмотреть модель модели?) - PullRequest
0 голосов
/ 23 июля 2010

На моем сайте есть Пользователи.Мой сайт имеет товары.Пользователи могут оставить отзыв о товаре.Пользователи могут оставить рейтинг предмета.Когда пользователи оценивают Предмет, они оценивают его в разных категориях: оценка качества сборки, оценка полезности, оценка эстетической привлекательности.

Итак, в моей базе данных в моей таблице «Обзоры» будет одна запись, а в моей таблице «Рейтинги» будет по три записи на элемент на пользователя.

Теперь на моей странице элементов я хочу отобразить десять наиболеенедавние обзоры и рейтинги.

Как я могу получить обзоры и соответствующие рейтинги и отправить их все в представление для отображения?

(я использую LINQ to SQL).

Спасибо.

РЕДАКТИРОВАТЬ: Извините, думал, что я включил достаточно информации.Вот еще немного информации о моей базе данных.Допустим, на моем сайте есть элементы разных видов.Допустим, он содержит информацию об автомобилях и книгах.Очевидно, что при оценке автомобиля у вас есть другие критерии, чем при оценке книги.

Я помещаю все свои оценки в одну таблицу рейтингов.

У меня есть таблица RatingsCategories.Он содержит два столбца:

RatingCategoryID  (Identity column)
RatingCategory    (name of category)

Категория «Обложка» будет применяться к книгам.Категория «Производительность» будет применяться к автомобилям.

У меня есть таблица рейтингов.Он содержит следующие столбцы:

RatingID  (Identity column)
EntityID  (Unique identifier among Cars AND Books)
UserID    (Identifier of the user who left the rating)
RatingCategoryID  (Reference to the category; FK from the RatingsCategories table)
Rating    (int;  the rating given)
DateModified (DateTime)

Итак, эта таблица может содержать все рейтинги книг и автомобилей.Одна книга может иметь три разных рейтинга на пользователя (обложка, контент, качество переплета и т. Д.), А одна машина может иметь три разных оценки на пользователя (внешний вид, производительность, простота обслуживания и т. Д.)

Аналогично моему отзывуТаблица может содержать отзывы о книгах и автомобилях.Это выглядит так:

ReviewID  (Identity column)
EntityID  (Unique identifier among Cars AND Books)
UserID    (Identifier of the user who left the rating)
Body      (Text of review)
DateModified  (DateTime)

Пользователь может оценивать и просматривать каждый элемент один раз.Поэтому, если посетитель сайта переходит на страницу книги, я хочу отобразить последние 10 обзоров и соответствующие рейтинги.Это означает, что мне нужно взять 10 самых последних записей Обзора для этой Книги.Мне также нужно получить десять самых последних полных рейтингов для этой книги (с тем же EntityID и тем же UserID, что и у обзоров), которые могут составлять три записи для каждого рейтинга.

Имеет ли это смысл?

Какой лучший способ сделать это?

Я схожу с ума от этого подхода и схемы базы данных?

Спасибо за ваше терпение.

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Здесь не так много, но я сделаю несколько предположений и попытаюсь ответить на ваш вопрос.

Допущения:

  1. Если вы используете LINQ to SQL, вывозможно, используется шаблон репозитория.
  2. Вы используете структуру реляционной базы данных, которая будет включать таблицы для привязки элементов к обзорам, а элементов к рейтингам.
  3. Я в некотором роде догадываюсь, как будет выглядеть структура вашей базы данных.быть.

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

<div class="latest-reviews-ratings">
    <% Html.RenderPartial("ReviewsAndRatings", Model.Reviews); %>
</div>

Тогда ваше частичное представление может выглядеть так, как вы хотите, чтобы оно выглядело ...

<div class="reviews">
    <% foreach (var reviewModel in Model) {%>
        <div class="review">
            Review of: <i><%: reviewModel.Item.Name %></i> by <b><%: reviewModel.Reviewer.Username %></b>.
            <div><%: reviewModel.Review.Value %></div>

            <ul class="ratings">
                <% foreach (var ratingModel in reviewModel.Ratings) {%>
                    <li>
                        <b><%: ratingModel.Rater.Username %></b> rated this a <%: ratingModel.Rating.Value %> on <%: ratingModel.Rating.CategoryName %>.
                    </li>
                <% } %>
            </ul>
        </div>
    <% } %>
</div>

Вашмодель представления может выглядеть так:

public class IndexViewModel
{
    public IEnumerable<ReviewViewModel> Reviews { get; set; }
}

Модель ReviewViewModel может выглядеть следующим образом:

public class ReviewViewModel
{
    public User Reviewer { get; set; }
    public Item Item { get; set; }
    public Review Review { get; set; }
    public IEnumerable<RatingViewModel> Ratings;
}

RatingViewModel:

public class RatingViewModel
{
    public User Rater { get; set; }
    public Rating Rating { get; set; }
}

Теперь все, что вам нужно сделать, этоподключите его в вашем контроллере.Вытащите свои записи ItemReview и создайте из них модели представлений.

var itemReviews = _itemReviewRepository.FindAll().OrderByDescending(p => p.Review.DateAdded).Take(10);
var reviewViewModels = itemReviews.Select(p =>
    new ReviewViewModel
    {
        Item = p.Item,
        Reviewer = p.User,
        Review = p.Review,
        Ratings = ReviewRatingService.GetRatingViewModelForReview(p.ReviewId)
    });

Вы можете перехватить часть этой логики в своем хранилище или классе обслуживания, если хотите.ReviewRatingService класс будет использовать запрос linq, подобный следующему: (примечание: определенно есть лучший запрос, но это тот, который я быстро придумал)

return (from rating in dataContext.Ratings
        join itemRating in dataContext.ItemRatings
            on rating.Id equals itemRating.RatingId
        join itemReview in dataContext.ItemReviews
            on itemRating.ItemId equals itemReview.ItemId
        join review in dataContext.Reviews
            on itemReview.ReviewId equals review.Id
        where review.Id == reviewId
        select new RatingViewModel
                {
                    Rater = itemRating.User,
                    Rating = rating
                });

Теперь вы можете заполнить модель представления индексас этими данными

var model = new IndexViewModel
{
    Reviews = reviewViewModels
};

и верните основную модель в ваше представление.

return View(model);

Я только что написал веб-приложение.Это было на самом деле довольно весело.

0 голосов
/ 23 июля 2010

Без дополнительной информации я думаю, что-то вроде этого будет работать:

Item.Reviews.OrderByDescending(d => d.date).Take(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...