C# 在实体框架查询中结合内部联接和左联接

C# 在实体框架查询中结合内部联接和左联接,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我有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 我有一个方法,根据投票数获得前十名的汽车 public IQueryab

我有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
我有一个方法,根据投票数获得前十名的汽车

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);
}
public IQueryable GetTopCars(int计数)
{
返回上下文
.Include(car=>car.UserVote)
.Where(car=>car.UserVote.Count>0)
.OrderByDescending(car=>car.UserVote.Count)
.记(数);
}
此代码只查看Cars和UserVote表,而不查看User上的ignoreUser字段。我试图更新我的实体框架代码以加入用户表,但没有任何成功。最终,我希望得到一个按用户投票数排序的汽车列表,不包括那些IgnoreUser设置为true的汽车。在上面的示例中,我希望该方法以正确的顺序返回IQueryable(本田思域,然后是雪铁龙C2)

我想我想乘汽车然后离开加入这个用户内部加入用户投票?实体框架是否可以实现这一点


这个问题来自于对a的评论中给出的建议。

如果您的
UserVote
实体中有
User
导航属性,那么您可以通过以下方式进行查询:

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 GetTopCars(int计数)
{
返回(在context.Car中从c返回)
让userVotes=car.UserVote.Where(uv=>!uv.User.IgnoreUser.Count())
其中用户投票>0
按用户投票排序
选择c)
.记(数);
}
如果要使用just join操作执行此操作,则可以执行以下操作:

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);
}
public IQueryable GetTopCars(int计数)
{
返回(在context.Car中从c返回)
让uservoces=(来自c.uservoces中的uv)
在上下文中加入u。uv.UserId上的用户等于进入用户的u.Id
其中u=>!u.IgnoreUser
选择u.Count()
其中用户投票>0
按用户投票排序
选择c
)
.记(数);
}

当我在join操作中使用第二个选项时,会返回重复的汽车-每次投票一辆。另外,userVotes总是等于一个我认为是由于内部联接导致的值?我将尝试修复第二个变量,您不能使用第一个解决方案,我确信它有效。@psych,我已经修复了它,但如果可以,我强烈建议使用第一个解决方案。我觉得它更干净