Лучший способ реализовать запрос к хранилищу - PullRequest
1 голос
/ 12 мая 2011

Вот что у меня сейчас есть:

    public IEnumerable<Review.Project> GetProjectsByUser(int userID)
    {
        var user = _context.Users.Where(u => u.UserID == userID).FirstOrDefault();

        return user != null ? user.Projects : new List<Review.Project>();
    }

Я удивляюсь, если есть лучший способ справиться с этим.

  1. Должен ли я проверить на ноль, как я?
  2. Должен ли я выдать ошибку вместо возврата пустой коллекции?
  3. Есть ли лучший способ получить список проектов, к которым принадлежит пользователь?

Это в моем C # репозитории, который использует Entity Framework.

Ответы [ 4 ]

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

В подобных случаях я предполагаю, что идентификатор пользователя существует, и я бы хотел, чтобы пользователь получил исключение в случае, если идентификатор пользователя недействителен. Кроме того, userID должен быть уникальным, поэтому в случае, если существует более одного userId - я бы тоже хотел получить исключение, чтобы предотвратить неправильные операции. Так что я бы сделал:

public IEnumerable<Review.Project> GetProjectsByUser(int userID)
{
    var user = _context.Users.Where(u => u.UserID == userID).Single();
    //Now I am sure that user is not null

    return user.Projects;
}

Но это зависит от ваших обозначений.

Итак, мои ответы вам:

Should I check for null like I am?

Если есть вероятность, что пользователь с идентификатором пользователя не существует - тогда да.

Should I throw an error instead of returning an empty collection?   

Если проектов нет, вы можете вернуть пустую коллекцию или null. Я не вижу причин, чтобы выдать ошибку.

Is there a better way to get a list of projects that the user belongs to?

Есть много способов, которые зависят от вашей модели, но то, что вы сделали, прекрасно.

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

Я бы поставил выбор перед .FirstOrDefault(), чтобы получить свойство навигации Projects,

public IEnumerable<Review.Project> GetProjectsByUser(int userID)
{
    var projects = _context.Users
        .Where(u => u.UserID == userID)
        .Select(u => u.Projects)
        .FirstOrDefault();

    return projects != null ? projects : new Review.Project[0];
}
0 голосов
/ 12 мая 2011

Что ж, вы можете избежать проверки на нулевое значение, напрямую запросив контекст Projects, предполагая, что у вас есть обратная ссылка на пользователя:

public IEnumerable<Review.Project> GetProjectsByUser(int userID)
{
    return _context.Projects.Where(p => p.User.UserID == userID);        
}

Возвращает пустое перечисляемое значение, если идентификатор пользователя равен нулю, пользователь не найден в базе данных, ИЛИ, если у пользователя нет проектов. Неважно, какой именно, и ни один из них не вызывает ошибку при выполнении запроса.

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

public IEnumerable<Review.Project> GetProjectsByUser(int userID)
{
    return _context.Projects.Where(p => p.Users.Any(u.UserID == userID));        
}

Это приведет к несколько менее эффективному, но все же неплохому запросу EXISTS, объединяющему пользователей через таблицу перекрестных ссылок «многие ко многим».

0 голосов
/ 12 мая 2011

1) Да, проверьте на ноль.2) Нет, если пользователь без каких-либо проектов не является действительно ошибочным условием.Даже тогда я бы рекомендовал регистрировать ошибку и возвращать пустую коллекцию.3) Мне нравится, что ты здесь делаешь.Это похоже на другие реализации, которые я видел.Единственное, на что вы можете обратить внимание - хотите ли вы, чтобы пользователь получил выражение (как написано) или актуализированную коллекцию (возврат user.Projects.ToList()).

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