根据另一个表中的值从一个表中选择行

时间:2017-01-25 16:01:25

标签: c# asp.net-mvc entity-framework

我有以下3个表格tblUsers tblFriendstblOnline,其中包含以下数据:

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 user1user2列中。

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();

但是,如果可能的话,我如何根据我提到的其他条件对其进行修改?

1 个答案:

答案 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链接表结构,这需要我们检查两个对,如果一个是在线而另一个是有问题的用户,反之亦然。