Получение более одного элемента из базы данных в ASP .NET MVC 3 - PullRequest
0 голосов
/ 25 мая 2011

Я создаю базу данных, в которую пользователи могут вводить некоторые отчеты об ошибках, и мы можем их просматривать.Я делаю эти базы данных с помощью C # в ASP MVC 3 .NET Framework (как и подразумевают теги)Каждый отчет об ошибках имеет уникальный идентификатор, называемый ReportId, поэтому ни один из них не хранится под одним и тем же идентификатором.Однако всякий раз, когда пользователь создает новую ошибку, я передаю его имя пользователя и сохраняю его вместе с остальной частью отчета (я использую User.Identity.Name.ToString (), чтобы получить его имя и сохранить его в виде строки).Я знаю, как получить один элемент из данных, используя лямбда-выражение, например:

db.DBSetName.Single(g => g.Name == genre)

Приведенный выше код основан на учебном пособии MVC 3 (The Movie Store), предоставленном ASP.Вот как они научили меня, как это делать.

Мой главный вопрос: есть ли такая функция-член, как .Single, которая будет анализировать всю базу данных и выводить только те записи базы данных, чье сохраненное имя пользователя соответствует этомуиз вошедшего в систему пользователя?Затем я могу использовать это, чтобы ограничить возможности пользователя только редактировать свои собственные записи, поскольку только его записи будут переданы в представление пользователя.

Каков наилучший способ реализовать это?Поскольку идентификатор отчета не будет изменен, можно создать новую структуру данных для хранения ошибок пользователя и передать ее в индексное (или домашнее) представление этого конкретного контроллера.Оттуда они должны иметь возможность щелкнуть любую ссылку для редактирования, которая передаст сохраненный ReportId обратно в действие редактирования этого конкретного контроллера, которое затем может выполнить поиск по всей базе данных.Правильно ли я считаю, что это сработает?И будет ли это идеальным, учитывая, что другие элементы в базе данных НЕ передаются в индекс в этом методе, что означает, что пользователь не имеет доступа к ReportId других элементов, которые пользователь должен передать в действие редактирования дляэто работать?Если это идеально, это метод, который требует от меня знать, как анализировать базу данных и захватывать каждый элемент, который соответствует определенному описанию (сохраненное имя пользователя соответствует текущему имени пользователя пользователя).

Или лучшеподход заключается в том, чтобы передать всю базу данных в представление индекса и вывести только те записи базы данных, которые имеют значения имени пользователя, соответствующие текущему зарегистрированному пользователю?Я предполагаю, что это можно сделать в цикле foreach с вложенным циклом if, например:

@foreach(var item in db.Reports)
{
    if(item.UserName == User.Identity.Name.ToString())
    {
        ...code to output table...
    }
}

Но при этом передается вся база данных, которая дает пользователю гораздо больше информации, чем ему нужно.Это также дает им потенциальный доступ к информации, которую я не хочу, чтобы они имели.Однако мне не нужно создавать новую структуру данных или базу данных, которая должна снизить использование памяти сервера и время выборки, верно?Или базы данных передаются путем копирования?Если так, то этот метод кажется глупым.Тем не менее, я не знаю, может ли первый метод сломать базу данных, этого, конечно, нет.Также не помню, если мне нужен оператор else в C #, я больше знаком с C ++, где он вам не нужен, и вам также не нужны {} для одной строки if, если она мне нужна:пожалуйста, не судите меня слишком строго по этому поводу!

Небольшое примечание: я использую контроллеры CRUD, созданные с помощью Entity First Framework, для редактирования моей базы данных.Таким образом, все создание, чтение, обновление и удаление кода были предоставлены для меня.Я решил не добавлять такой основной, общий код.Если это необходимо, я могу добавить его.Я добавлю, как выглядит действие редактирования:

public ActionResult Edit(string id)
{
    Report report = db.Reports.Find(id);
    return View(report);
}

Он принимает строку в качестве идентификатора, ReportId - это используемый идентификатор, и он является строкой.Это случайно сгенерированная строка GUID, созданная с помощью функции GUID.NewGuid (). ToString ().Я также буду сравнивать имена с:

Model.UserName == User.Identity.Name.ToString()

, который был показан ранее.Извините, если это слишком много текста, я хотел предоставить как можно больше информации и никого не рассердить.Если требуется дополнительная информация, она, безусловно, может быть предоставлена.Итак, в конце поста главный вопрос на самом деле сводится к тому, какой из двух вышеуказанных методов является лучшим?И, если это первый, как мне реализовать что-то подобное?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 25 мая 2011

Если я не совсем вас неправильно понимаю, вы просто хотите .Where()

Как это:

var reports = db.Reports.Where(r => r.genre == inputGenre);

Это даст вам IEnumerable Report, который вы затем сможете использовать по своему усмотрению.

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