如何正确计算实体

本文关键字:实体 计算 何正确 | 更新日期: 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;
    }