запрос linq, чтобы получить последнюю запись со значением по умолчанию, если пустой список возврата - PullRequest
0 голосов
/ 12 ноября 2019

Ниже приведен полный пример кода

static class Program {
    public static List<User> Users = new List<User>();
    public static List<Claim> Claims = new List<Claim>();
    public static List<Valuation> Valuations = new List<Valuation>();
    public static List<Status> Statuses = new List<Status>();
    public static List<StatusHistory> StatusHistories = new List<StatusHistory>();

    static void Main()
    {
        DataSeed();
        var claims = GetClaims(true,0,DateTime.MinValue,DateTime.MaxValue);
        Console.Write(claims);
    }

    static List<ClaimDto> GetClaims(bool active,int userId, DateTime fromDate, DateTime toDate){
        var claimsInDb = (from status in Program.Statuses
                                join statusHistory in Program.StatusHistories on status.Id equals statusHistory.StatusId
                                join claim in Program.Claims on statusHistory.ClaimId equals claim.Id
                                join valuation in Program.Valuations on claim.ActiveEvaluationId equals valuation.Id
                                join user in Program.Users on claim.AssignedTo equals user.Id into joined
                                from joinedUser in joined.DefaultIfEmpty()

                                      where status.Active & active
                                          ? status.Name != "Complete"
                                          : status.Name == "Complete"
                                            & statusHistory.CreatedDt > fromDate & statusHistory.CreatedDt < toDate
                                            & userId == 0
                                              ? joinedUser.Id != -1
                                              : joinedUser.Id == userId

                                      group new ClaimDto
                                    {
                                        Id = claim.Id,
                                        AssignedToUserFullName = joinedUser.FullName,
                                        CreatedDt = claim.CreatedDt,
                                        Status = status.Name,
                                        Version = valuation.Version
                                    } 
                                    by new
                                    {
                                        claim.Id
                                    }
                                into grouped

                                //where  active
                                //    ? grouped.Key.status.Name != "Complete"
                                //    : grouped.Key.status.Name == "Complete"
                                //      & grouped.Key.statusHistory.CreatedDt > fromDate& grouped.Key.statusHistory.CreatedDt < toDate
                                //      & userId == 0 
                                //        ? grouped.Key.joinedUser.Id != 0
                                //          : grouped.Key.joinedUser.Id == userId

                                //orderby grouped.Key.statusHistory.CreatedDt descending 

                                select grouped.FirstOrDefault()
                            ).ToList();
        return claimsInDb;
    }

    static void DataSeed(){
    //dataSeed
        Users.Add(new User
        {
            Id = 1,
            FullName = "Dmitry Post",
        });

        Claims.AddRange(new List<Claim>
        {
            new Claim
            {
                Id = 1,
                AssignedTo = 1,
                CreatedDt = DateTime.Now,
                ActiveEvaluationId = 1
            },
            new Claim
            {
                Id = 2,
                AssignedTo = 1,
                CreatedDt = DateTime.Now,
                ActiveEvaluationId = 2
            }
        });

        Valuations.AddRange(new List<Valuation>
        {
            new Valuation
            {
                Id = 1,
                Version = 1,
                ClaimId = 1
            },
            new Valuation
            {
                Id = 2,
                Version = 1,
                ClaimId = 2
            }
        });

        Statuses.AddRange(new List<Status>
        {
            new Status
            {
                Id = 1,
                Name = "New",
                Active = true,              
            },
            new Status
            {
                Id = 2,
                Name = "In Progress",
                Active = true,
            },
            new Status
            {
                Id = 3,
                Name = "Complete",
                Active = true,
            }
        });

        StatusHistories.AddRange(new List<StatusHistory>
        {
            new StatusHistory
            {
                Id = 1,
                ClaimId = 1,
                CreatedDt = DateTime.Now.AddDays(-10),
                StatusId = 1
            },
            new StatusHistory
            {
                Id = 2,
                ClaimId = 1,
                CreatedDt = DateTime.Now.AddDays(-1),
                StatusId = 2
            },
            new StatusHistory
            {
                Id = 3,
                ClaimId = 2,
                CreatedDt = DateTime.Now.AddDays(-10),
                StatusId = 1
            },
            new StatusHistory
            {
                Id = 4,
                ClaimId = 2,
                CreatedDt = DateTime.Now.AddDays(-9),
                StatusId = 2
            },
            new StatusHistory
            {
                Id = 5,
                ClaimId = 2,
                CreatedDt = DateTime.Now.AddDays(-8),
                StatusId = 3
            },
        });
    }
}
//objects
class ClaimDto{
public int Id {get;set;}
public DateTime CreatedDt {get;set;}
public string Status {get;set;}
public int Version {get;set;}
public string AssignedToUserFullName {get;set;}
}

class Status{
public int Id {get;set;}
public string Name {get;set;}
public bool Active {get;set;}
}

class StatusHistory{
public int Id {get;set;}
public int StatusId {get;set;}
public int ClaimId {get;set;}
public DateTime CreatedDt {get;set;}
}

class Claim{
public int Id {get;set;}
public int ActiveEvaluationId {get;set;}
public DateTime CreatedDt {get;set;}
public int AssignedTo {get;set;}
}

class Valuation{
public int Id {get;set;}
public int Version {get;set;}
public int ClaimId {get;set;}
}

class User{
public int Id {get;set;}
public string FullName {get;set;}
}


Мой желаемый результат - когда active = true, userId = 0, fromDate = DateTime.MinValue, toDate = DateTime.MaxValue

Toвозвращение 1 Запись: одна, потому что есть одна заявка с полной историей состояния.

Когда активен = false, userId = 0, fromDate = DateTime.MinValue, toDate = DateTime.MaxValue

Комуreturn 1 Запись: Одна, потому что есть одна заявка, которая не имеет завершенных историй состояния.

Когда active = false, userId = 1, fromDate = DateTime.Now.AddDays (-5), toDate = DateTime.MaxValue

Для возврата 1 запись: одна, поскольку первая заявка заполняет последнюю историю состояния CreateDt в пределах диапазона дат, и заявка назначается пользователю с таким идентификатором

...