我想让我的用户搜索属于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;
}