Как получить данные, используя select из вложенных свойств - linq - PullRequest
0 голосов
/ 27 апреля 2020

Вот моя структура данных:

public class Product
{
    // Rest of props

    public ICollection<ProductUpdate> ProductUpdate { get; set; }
}

public class ProductUpdate 
{
    // Rest of props

    public Delivery Delivery { get; set; }
}

public class Delivery
{
    // Rest of props

    public virtual ICollection<DeliveryUsersApprovers> DeliveryUsersApprovers { get; set; }
}

public class DeliveryUsersApprovers
{
    // Rest of props

    public User User { get; set; }
}

Как мне написать синтаксический запрос метода linq, который бы выбирал Id, StartDate и Note из ProductUpdate, в то время как он выбирал бы для каждой строки ProductUpdate отвечающий пользователь, который сделал обновление, содержащееся в классе DeliveryUsersApprovers. Я хотел бы добиться этого, используя .Select(), чтобы получить только необходимые столбцы ..

Я пробовал что-то вроде это, но это не работает:

var paymentStatusUpdates = await _dbContext.Product.Include(x => x.ProductUpdate)
.Select(x => new SomeCustomClassObjectWithFourProperties
{
    // Read data from ProductUpdate somehow and select Id, Date and Note from ProductUpdate and  get User from nested property
                           .Select(y=> new SomeCustomClassObjectWithFourProperties 
                           { 
                               Id = y.Id,
                               Date=y.StartDate,
                               Note=y.Note,
                               User=? // this is User from very nested prop
                           })

})
.FirstOrDefaultAsync(x => x.Id == productId, cancellationToken); //productId is received in method params

Я действительно изо всех сил пытаюсь проникнуть во вложенную подпорку и достичь User для каждого ProductUpdate, поэтому любая помощь будет отличной !!

Спасибо

1 Ответ

0 голосов
/ 27 апреля 2020

Используйте SelectMany, чтобы сгладить DeliveryUsersApprovers коллекцию, затем сопоставить каждый DeliveryUsersApprovers в Result объект, который содержит данные User и ProductUpdate.

Я попробовал это на манекене IEnumerable, пожалуйста, замените products в моем примере на _dbContext.Product.Include(x => x.ProductUpdate), чтобы увидеть, работает ли он.

var products = new List<Product>();

var results = products.Select(product => product.ProductUpdate
                .SelectMany(productUpdate => productUpdate.Delivery.DeliveryUsersApprovers
                    .Select(deliveryUsersApprovers => new Result()
                        {
                            Id = productUpdate.Id,
                            Date = productUpdate.Date,
                            Note = productUpdate.Note,
                            User = deliveryUsersApprovers.User
                        })));
...