如何正确计算实体

时间:2011-07-17 10:17:40

标签: c# entity-framework

我有一个属性为“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;

    }

3 个答案:

答案 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;
    }