我有3个类/表:Car
,User
和UserVote
(这是其他两个之间的桥接表)。
例如:
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的评论中给出的建议进行的。
答案 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);
}