这就是我现在所拥有的:
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>();
}
我很奇怪是否有更好的方法来解决这个问题。
这是在我使用Entity Framework的C#存储库中。
答案 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];
}