我有一个属性为“user”的方法,我正在尝试检查他是否已经在给定的“课程”团队中
private static bool UserIsInTeamOfCourse(Course course, User user)
{
var count = course.Teams.Count(x => x.Users.Contains(user));
if (count > 0)
{
return true;
}
return false;
}
但它不起作用。我在我的用户模型中制作了一个自定义的Equals方法,但它仍然不起作用。 [编辑]它总是计入零个条目,但必须至少有一个条目。
public override bool Equals(object obj)
{
return UserId == ((User)obj).UserId;
}
答案 0 :(得分:1)
bool isUserInAnyTeam = course.Teams.Any(t => t.Users.Any(u => u.Id == user.Id));
这是对象的LINQ,因为您正在查询内存中的Teams
集合。因此,它假定Teams
集合已加载或将被延迟加载。如果未加载并且您不使用延迟加载,则可以在集合上创建数据库查询:
在带有DbContext的EF 4.1中:
bool isUserInAnyTeam = dbContext.Entry(course).Collection(c => c.Teams).Query()
.Any(t => t.Users.Any(u => u.Id == user.Id));
或者在EF 4.0中:
bool isUserInAnyTeam = course.Teams.CreateSourceQuery()
.Any(t => t.Users.Any(u => u.Id == user.Id));
Teams
在最后一种情况下必须是EntityCollection<Team>
类型。
另一种方法是从头开始查询:
bool isUserInAnyTeamOfCourse = context.Courses.Any(
c => c.Id == course.Id && c.Teams.Any(t => t.Users.Any(u => u.Id == user.Id)));
答案 1 :(得分:0)
假设团队和用户之间存在多对多关系,并且用户不会成为同一团队的两倍。
var count = (from c in context.Teams
from u in c.Users
where u.Id == 1
select c.Id).Count();
实体框架无法将您覆盖的c#代码转换为等于sql函数。
答案 2 :(得分:0)
而不是比较自定义对象比较userID(可能是int或其他简单类型)
private static bool UserIsInTeamOfCourse(Course course, User user)
{
return course.Teams.Where(team => team.Users.Any(u => u.userID == user.userID)).Count() > 0;
}