如何正确计算实体
本文关键字:实体 计算 何正确 | 更新日期: 2023-09-27 18:02:24
我有一个方法,它有一个属性"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;
}
但是它不起作用。我在我的User模型中创建了一个自定义Equals方法,但它仍然不起作用。[EDIT]它总是计数0项,但必须至少有一个条目。
public override bool Equals(object obj)
{
return UserId == ((User)obj).UserId;
}
bool isUserInAnyTeam = course.Teams.Any(t => t.Users.Any(u => u.Id == user.Id));
这是LINQ to Objects,因为您正在查询内存中的Teams
集合。因此,它假定Teams
集合已经加载或将惰性加载。如果它没有加载,并且你不使用延迟加载,你可以在集合上创建一个数据库查询:
在EF 4.1中使用DbContext:
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)));
假设团队和用户之间存在多对多的关系,并且一个用户不会成为同一个团队的两次成员。
var count = (from c in context.Teams
from u in c.Users
where u.Id == 1
select c.Id).Count();
实体框架无法将你的c#代码转换为sql函数
不比较自定义对象,而比较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;
}