如何在多个表上执行复杂的linq搜索查询?

问题描述 投票:0回答:1

我想让我的用户搜索属于ConnectorLocation(ApplicationUserId,SiteId)表的用户,这些用户具有特定的SiteId。

从后者的用户中,搜索将在以下任何信息中执行。

-在ApplicationUser表中找到的用户名

-年龄为ApplicationUser表中的DOB。

在ApplicationUser表中找到的-emailAddress。

-religionName在Religion表中找到,其中ReligionId是ApplicationUser表中的一个外键。

-在Category表中找到的兴趣名称,其中InterestId是UserInterests(InterestId,ApplicationUserId)表中的一个外键。

-locationName在Sites表中找到,其中LocationId是ApplicationUser表中的外键。

搜索是基于"%Like%"的概念,不一定相同。

我想使用Skip & Take linq操作,因为我想根据给定的pageNumber懒加载搜索查询的结果。

在所有的查询中,我只想要结果中的用户的用户名和profilePicture。

该方法的结构如下:searchConnectors(string query,int pageNumber, int SiteId)

我在高效检索结果时遇到了一个问题,由于数据不知为何很大,没有很大的开销。

任何帮助是感激!!!!!!!!!!。

这是我试过的,我知道这不是很有效。

    [HttpGet]
    [Route("searchConnectors/{query}/{siteId}/{pageNumber}")]
    public string searchConnectors(string query, int siteId,int pageNumber)

    {

        int skip = 10 * (pageNumber - 1);

        var ids = _dbContext.ConnectorLocations.Where(c => c.SiteId == siteId).Select(c=>c.ApplicationUserId).ToList();



        var find = _dbContext.Religions.Where(c => c.Name.ToLower().Contains(query.ToLower())).Select(c=>c.Id).ToList();
        List<string> religionUsers = new List<string>();
        if (find.Any()) {

           var findUsers = _dbContext.ApplicationUsers.Where(c => find.Contains((int)c.ReligionId) && ids.Contains(c.Id)).Select(p => p.Id).ToList();
            if (findUsers.Any())
            {
              // var queryReligion= _dbContext.ApplicationUsers.Where(c => c.ReligionId == id).Select(p=>p.Id).ToList();
                religionUsers.AddRange(findUsers);
            } 
        }


        var isNumeric = int.TryParse(query, out _);
        List<string> ageUsers = new List<string>();
        int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
        if (isNumeric)
        {
            var checkDOB = _dbContext.ApplicationUsers.AsEnumerable().Where(x => ids.Contains(x.Id) &&((now-int.Parse(x.DateOfBirth.ToString("yyyyMMdd")))/10000)==int.Parse(query)).Select(x=>x.Id).ToList();
            if(!checkDOB.Any())
            {
                isNumeric = false;
            }
            else
            {
                ageUsers.AddRange(checkDOB);
            }
        }

        List<string> locationUsers = new List<string>();
        var findLocation = _dbContext.Sites.Where(c => c.Name.ToLower().Contains(query.ToLower())).Select(x=>x.LocationId).ToList();
        if (findLocation.Any())
        {

            var checkLocations = _dbContext.ApplicationUsers.Where(c => ids.Contains(c.Id) && findLocation.Contains((int)c.LocationId)).Select(c => c.Id).ToList();

            if (checkLocations != null)
                locationUsers.AddRange(checkLocations);
        }

        List<string> interestsUsers = new List<string>();
        var category = _dbContext.Categories.Where(c => c.Name.ToLower().Contains(query.ToLower())).Select(c=>c.Id).ToList();
        if (category.Any())
        {

            var checkInterests = _dbContext.UserInterests.Where(c => category.Contains(c.CategoryId)).Select(c => c.ApplicationUserId).ToList();

            if (checkInterests != null)
                interestsUsers.AddRange(checkInterests);
        }

        var result = (from t1 in _dbContext.ApplicationUsers
                      from t2 in _dbContext.ConnectorLocations
                      where t2.SiteId == siteId && t1.Id.Contains(t2.ApplicationUserId) &&( t1.Gender == query || t1.Email == query|| t1.PhoneNumber==query||religionUsers.Contains(t2.ApplicationUserId) || interestsUsers.Contains(t2.ApplicationUserId) || locationUsers.Contains(t2.ApplicationUserId) || ageUsers.Contains(t2.ApplicationUserId) ||t1.Name == query|| t1.UserName==query)
                      select new{userName = t1.UserName,profilePicture = t1.ProfilePicture }).Skip(skip).Take(10).Distinct().ToList();

        var json = JsonSerializer.Serialize(result);
        return json;

    }
c# sql linq search nested-queries
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.