1

I have two tables to join. The joining condition is a column that should be like or starts with the other column, not exactly equal. How to do that in Linq? This is my function:

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

        // Fetch IQueryable<RuTasks> 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<Guid?>().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.");
    }
}

Here is the joining condition that I want to fix:

join rt in ruTasksQueryable.Where(rt => rt.PackageBusinessId.StartsWith(p.Id)) on p.Id equals !rt.PackageBusinessId.Equals(p.Id) into rtGroup

Example: my p.Id = P__20240623_2KI9T while my rt.PackageBusinessId= P__20240623_2KI9T__SMSA

they are different by the suffix only, how can I join the two tables based on that???

3
  • How is your current condition bad? Can you provide sample inputs, the result and the expected result? Commented Jun 23 at 13:50
  • I edited the question and I added an example
    – sara
    Commented Jun 23 at 14:01
  • Sorry, I have written originally an answer meant for another question. Edited it now. Commented Jun 23 at 14:19

1 Answer 1

0

You will just need to invert your criteria, as in

rt => p.Id.StartsWith(rt.PackageBusinessId)

Not the answer you're looking for? Browse other questions tagged or ask your own question.