Linq针对复杂请求的问题

问题描述

我有一个用户列表,每个用户都有#标签列表。

在我的应用中,我提供了一种通过标签搜索结果方法

在我的api中,我将搜索字符串分开以分别获取每个主题标签,而我尝试使用的是:

用户实体,共同的#标签数和相关的#标签

例如:

我的课程如下:

    public class UserDto
    {
        public List<HashtagDto> Hashtags { get; set; }

    }

    public class HashtagDto
    {
        string name { get; set; }

    }

    public class UserHashtagSearchResultDto
    {
        public UserDto UserFk { get; set; }

        public int CountResults { get; set; }

        public List<HashtagDto> HashtagsFk { get; set; }
    }

我的查询

if (searchText.IsNullOrEmpty())
            return null;

        var splits = searchText.Split(new string[] { " " },System.StringSplitOptions.RemoveEmptyEntries);
        
        List<string> hashes = HashtagHelper.ToHashkeys(splits);

        if (hashes != null && hashes.Count() > 0)
        {
            User.GetUsers().Include(h => h.Hashtags).Where(s => hashes.Contains(....).Select((hs) =>
             {
                 return new UserHashtagSearchResultDto
                 {

                 }
            });
        }

输入将是:跑步游泳

输出将是:

列表

示例:

结果1 { UserFk = User1

        CountResults=2 (the two hashtags of this user exists in the hashtag repository)

        HashtagsFk=List<Hashtag>{hashtag1,hashtag2}; // (swimming and running}
    }

结果1 { UserFk = User2

        CountResults=1 (only the hashtag swimming existsin the hashtag repository)

        HashtagsFk=List<Hashtag>{hashtag1}; // (swimming)
    }

我不知道linq怎么做。

解决方法

好,这是我的问题的答案。

  var userCommon = _userRepository.GetAll().Include(h => h.HashtagUsers).ThenInclude(h => h.HashtagFk)
                 .Where(s => hashes.Intersect(s.HashtagUsers.Select(h => h.HashtagFk.Code).AsEnumerable()).Count() > 0);

            userCommon.ForEach(res =>
            {
                var result = new HashtagResultSearchDto();
                result.UserFk = ObjectMapper.Map<UserDto>(res);

                var d = res.HashtagUsers.AsQueryable().Select(h => h.HashtagFk);

                result.CountResult = result.Hashtags.Count();
                result.UserId = res.Id;

                hashtagResultSearchDtos.Add(result);
            });