在Entity Framework查询中组合内连接和左连接

时间:2016-06-18 17:32:42

标签: c# entity-framework linq linq-to-entities

我有3个类/表:CarUserUserVote(这是其他两个之间的桥接表)。

例如:

Car (id / name):
1 / Ford Focus
2 / Honda Civic
3 / Citroen C2

User (id / ignoreUser):
1 / false
2 / true
3 / false

UserVote (UserId / CarId)
1 / 2
1 / 3
2 / 1
3 / 2

我有一种方法可以根据投票数量获得前X车。

public IQueryable<Car> GetTopCars(int count)
{
    return context.Car
        .Include(car => car.UserVote)
        .Where(car => car.UserVote.Count > 0)
        .OrderByDescending(car => car.UserVote.Count)
        .Take(count);
}

此代码仅查看Cars和UserVote表,并且不查看User上的ignoreUser字段。我正在尝试更新我的实体框架代码以加入User表,但我没有取得任何成功。最终,我希望获得按UserVotes数量排序的汽车列表,不包括IgnoreUser设置为true的那些。在上面的例子中,我希望该方法以正确的顺序返回IQueryable(Honda Civic然后是Citroen C2)。

我想我想拿汽车然后离开加入这个用户内部加入UserVote?这是否可以使用Entity Framework?

这个问题是根据对previous question的评论中给出的建议进行的。

1 个答案:

答案 0 :(得分:2)

如果您的User实体中有UserVote导航属性,那么您可以这样查询:

public IQueryable<Car> GetTopCars(int count)
{
    return (from c in context.Car
            let userVotes=car.UserVote.Where(uv=>!uv.User.IgnoreUser).Count()
            where userVotes > 0
            orderby userVotes
            select c)
           .Take(count);
}

如果您只想使用加入操作,那么您可以这样做:

public IQueryable<Car> GetTopCars(int count)
{
    return (from c in context.Car
            let userVotes=(from uv in c.UserVotes
                           join u in context.Users on uv.UserId equals u.Id into users
                           where u=>!u.IgnoreUser
                           select u).Count()
            where userVotes > 0
            orderby userVotes
            select c
           )
           .Take(count);
}