实现存储库查询的更好方法

时间:2011-05-12 19:03:06

标签: c# entity-framework repository

这就是我现在所拥有的:

    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. 有没有更好的方法来获取用户所属的项目列表?
  4. 这是在我使用Entity Framework的C#存储库中。

4 个答案:

答案 0 :(得分:1)

在这种情况下,我假设userID存在,我希望用户在userID无效的情况下获得异常。另外,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?

如果有可能用户ID不存在 - 那么是。

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?

有许多方法取决于你的模特,但你做的很好。

答案 1 :(得分:0)

1)是的,检查是否为空。 2)否,除非用户没有任何项目确实是错误的条件。即便如此,我还是建议记录一个错误并返回一个空集合。 3)我喜欢你在这里做的事情。它与我见过的其他实现类似。您可能想要解决的唯一考虑因素是您是希望用户接收表达式(如已写入)还是已实现的集合(返回user.Projects.ToList())。

答案 2 :(得分:0)

好吧,假设你有对用户的反向引用,你可以通过直接查询Projects上下文来避免检查null:

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

如果userID为null,则在数据库中找不到用户,或者如果用户没有项目,则返回空的可枚举。无论哪个都没关系,并且在运行查询时都不会导致错误。

编辑:如果项目有一组用户而不是一个,请尝试以下方法:

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

这将产生性能稍差但仍然不错的EXISTS查询,通过多对多交叉引用表加入用户。

答案 3 :(得分:0)

我会在.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];
}