簡體   English   中英

linq或lambda語法中的共同朋友的等效查詢

[英]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不一定是朋友)。

如果關系是兩種方式,則有兩種選擇:

  1. 將關系定義為DB中的兩行(每行描述一種方式)。
  2. 該關系是隱式的雙向關系,那么您應該重構上面的LINQ查詢:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM