Объединение таблиц на основе функции StartsWithC#

Место общения программистов C#
Anonymous
Объединение таблиц на основе функции StartsWith

Сообщение Anonymous »

Мне нужно объединить две таблицы. Условием соединения является столбец, который должен быть похож на другой столбец или начинаться с него, но не совсем равен. Как это сделать в Linq? Это моя функция:

Код: Выделить всё

public async Task GetAllWithCamundaTaskForCarrierAsync(GetPackageInput input)
{
try
{
var dbSet = await GetDbSetAsync();

// Fetch IQueryable by awaiting the task
var ruTasksQueryable = await _ruTasksRepository.GetQueryableAsync();

var tasks = await _tasksRepository.GetQueryableAsync();

var passportPackageId = new GetPassportInput
{
PackageId = input.Id
};
var getPaspportCarrierTypeStmt = await _passportRepository.GetPassportCarrierTypeAsync(passportPackageId);

// Fetch distinct user IDs from the filtered ruTasks
var userIds = ruTasksQueryable.Where(rt => rt.AssignedUserId.HasValue && rt.AssignedUserId != Guid.Empty)
.Select(rt => rt.AssignedUserId.Value)
.Distinct()
.ToList();

// Get user info from the userInfo service
var userInfoList = await _userInfoManager.GetUserInfo(new getUserInfoInput
{
Ids = userIds.Cast().ToList(),
JWT = _httpContextAccessor.HttpContext.Items["UserToken"]?.ToString()
});

// Convert the userInfoList to a dictionary for efficient lookup
var userInfoDict = userInfoList.ToDictionary(user => user.Id);

// Fetch the necessary data from the database
var packages = await dbSet.ToListAsync();

// Join data in memory
var query = from p in packages
join rt in ruTasksQueryable.Where(rt => rt.PackageBusinessId.StartsWith(p.Id)) on p.Id equals !rt.PackageBusinessId.Equals(p.Id) into rtGroup
from rt in rtGroup.DefaultIfEmpty()
join t in tasks on rt?.TasksId equals t.Id into tGroup
from t in tGroup.DefaultIfEmpty()
join user in userInfoList on rt?.AssignedUserId equals user.Id into userGroup
from user in userGroup.DefaultIfEmpty()
join pct in getPaspportCarrierTypeStmt on p.Id equals pct.PackageId into pctGroup
from pct in pctGroup.DefaultIfEmpty()
orderby p.LastModificationTime descending
select new GetAllPackagesWithCamundaTaskOutput
{
ShortId = p.ShortId,
PackageId = p.Id,
PackageBusinessId = rt?.PackageBusinessId,
PassportCount = p.PassportCount,
PackageStatusName = p.PackageStatus,
PackageReceivedAt = p.CreationTime,
PackageLastUpdated = p.LastModificationTime,
CamundaTaskId = rt?.Id,
AssignedGroupId = rt?.AssignedGroupId,
AssignedUserId = rt?.AssignedUserId,
AssignedUser = user?.FirstName + " " + user?.LastName,
AssignedUsername = user?.Username,
PhaseName = rt?.TasksId,
CountPassports = pct?.CountPassports,
CountSmsa = pct?.CountSMSA,
CountSpl = pct?.CountSPL
};

// Apply additional filters and execute the query
query = GetAllWithCamundaTaskForCarrierAsyncApplyFilters(query, input);
var result = query.ToList();

return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred in GetAllWithCamundaTaskForCarrierAsync");
throw new Exception("An internal error occurred during your request. Please try again later.");
}
}
Вот условие соединения, которое я хочу исправить:

Код: Выделить всё

join rt in ruTasksQueryable.Where(rt => rt.PackageBusinessId.StartsWith(p.Id)) on p.Id equals !rt.PackageBusinessId.Equals(p.Id) into rtGroup
Пример:
мой p.Id = P__20240623_2KI9T
а мой rt.PackageBusinessId= P__20240623_2KI9T__SMSA
они различаются только суффикс, как я могу объединить две таблицы на основе этого???

Подробнее здесь: https://stackoverflow.com/questions/786 ... h-function

Вернуться в «C#»