我有以下3个表格tblUsers
tblFriends
和tblOnline
,其中包含以下数据:
tblUsers
id username
1 john
2 jack
3 mike
4 paul
tblFriends
id User1 User2 Active
1 2 1 True
tblOnline
id ConnId UserId
3 aaaa22 2
4 bbbb33 3
我想基于tblOnline
中的john
列,检索ID为1
的用户UserId
来自tblOnline
的所有行,是否是不是john
而且UserId
是朋友(基于tblFriends
表)。
在这个特定的例子中,我希望得到来自tblOnline
的id 3行,因为john和jack是朋友而jack是在tblOnline
表中(他们是朋友,因为他们的id匹配在tblFriends
user1
和user2
列中。
tblOnlineDTO
[Table("tblOnline")]
public class OnlineDTO
{
[Key]
public int Id { get; set; }
public string ConnId { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public virtual UserDTO Users { get; set; }
}
FriendDTO
[Table("tblFriends")]
public class FriendDTO
{
[Key]
public int Id { get; set; }
public int User1 { get; set; }
public int User2 { get; set; }
public bool Active { get; set; }
[ForeignKey("User1")]
public virtual UserDTO Users1 { get; set; }
[ForeignKey("User2")]
public virtual UserDTO Users2 { get; set; }
}
UserDTO
[Table("tblUsers")]
public class UserDTO
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
所以要从tblOnline
获取所有行,我会执行以下操作:
db.Online.ToArray().Select(x => new OnlineVM(x)).ToList();
但是,如果可能的话,我如何根据我提到的其他条件对其进行修改?
答案 0 :(得分:2)
这样的事情应该可以胜任:
var userName = "john";
var online = db.Online
.Where(o => db.Friend.Any(f =>
(f.User1 == o.UserId && f.Users2.Username == userName) ||
(f.User2 == o.UserId && f.Users1.Username == userName)))
.AsEnumerable()
.Select(o => new OnlineVM(o))
.ToList();
过滤条件的主要难点来自tblFriends
链接表结构,这需要我们检查两个对,如果一个是在线而另一个是有问题的用户,反之亦然。