[英]the equivalent query of mutual friends in linq or lambda syntax
我有兩個表tblFriends和tblUsers,它們存儲用戶的ID和朋友的ID。 現在,我想在“ tblFriends”表中找到user1和user2的共同朋友,並詳細了解他們的昵稱,年齡...
tblUsers:
Username nvarchar
Avatar nvarchar
Age int
tblFriends:
IdUser1 nvarchar
IdUser2 nvarchar
FriendStatus int
我在sql中找到了波紋管解決方案,它可以正常工作,但是我需要在LINQ或Lambda中使用此查詢
我找到的解決方案在這里( https://www.codeproject.com/Questions/280296/query-to-display-mutual-friends )
SELECT P1.Name
FROM dbo.Friendship AS F1
JOIN dbo.Person AS P1 ON P1.ID = F1.FriendID
WHERE F1.PersonID = 1 AND
F1.FriendID IN (SELECT F2.FriendID
FROM dbo.Friendship AS F2
WHERE F2.PersonID = 2)
此示例等效於給定的SQL查詢
using System;
using System.Collections.Generic;
using System.Linq;
namespace Friends
{
class Program
{
static void Main(string[] args)
{
var data = new GenerateExampleData();
var lstFriendId = (from f in data.lstFriend
where f.PersonId == 2
select f.FriendId
);
var lstMutualFriend = (from f in data.lstFriend
join p in data.lstPerson on f.FriendId equals p.Id
where lstFriendId.Contains(f.FriendId) && f.PersonId == 1
select p.Name
);
foreach (var item in lstMutualFriend)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
public class GenerateExampleData
{
public List<Person> lstPerson;
public List<Friendship> lstFriend;
public GenerateExampleData()
{
lstPerson = new List<Person>
{
new Person
{
Id = 1,
Name ="Person1"
},
new Person
{
Id = 2,
Name ="Person2"
},
new Person
{
Id = 3,
Name ="Person3"
},
new Person
{
Id = 4,
Name ="Person4"
},
};
lstFriend = new List<Friendship>
{
new Friendship
{
PersonId = 1,
FriendId = 2
},
new Friendship
{
PersonId = 1,
FriendId = 4
},
new Friendship
{
PersonId = 2,
FriendId = 4
},
};
}
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Friendship
{
public int PersonId { get; set; }
public int FriendId { get; set; }
}
}
無需Join
:
var mutualFriendsNames = db.Users
.Where(u =>
db.FriendShips.Any(f => f.FriendId == u.Id && f.UserId == 1) &&
db.FriendShips.Any(f => f.FriendId == u.Id && f.UserId == 2))
.Select(p => p.Name);
請注意,僅當友誼關系是單向關系時才有效(如果user1與user2是朋友,則user2與user1不一定是朋友)。
如果關系是兩種方式,則有兩種選擇:
var mutualFriendsNames = db.Users
.Where(u =>
db.FriendShips.Any(f =>
(f.FriendId == u.Id && f.UserId == 1) ||
(f.FriendId == 1 && f.UserId == u.Id)) &&
db.FriendShips.Any(f =>
(f.FriendId == u.Id && f.UserId == 2) ||
(f.FriendId == 2 && f.UserId == u.Id)))
.Select(p => p.Name);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.