Выбрать внутри выбора с помощью лямбда-выражений - PullRequest
0 голосов
/ 29 апреля 2018

Друзья

Я пытаюсь выбрать коллекцию внутри моей ViewModel, но я думаю, что я делаю это неправильно, потому что моя конечная точка входит в бесконечный цикл, когда я сохраняю выборку в запросе.

var products = 
    await _context.product
    .Select(prod => new ProductViewModel() {
        id = prod.id,
        name = prod.name,
        description = prod.description,
        rating = prod.rating,
        price = prod.price,
        photos = _context.product_photo
        .Where(photo => photo.product_id == prod.id)
        .Select(photo => new ProductPhotoViewModel()
        {
            product_id = photo.product_id,
            path = photo.path
        }).ToList()
    }).ToListAsync();

Where() внутри подвыбора это просто неудачная попытка заставить его работать. Я решил оставить этот вопрос только для того, чтобы сказать: «Я тоже уже пробовал, но не сработало»

Как мне выбрать коллекцию? Если у этой коллекции есть другая подколлекция, ее тоже можно выбрать?

EDIT:

ProductViewModel:

public class ProductViewModel
{
    //Product
    public string id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public int? rating { get; set; }
    public decimal price { get; set; }

    //Product photo
    public List<ProductPhotoViewModel> photos;
}

ProductPhotoViewModel:

public class ProductPhotoViewModel
{
    public string product_id { get; set; }
    public string path { get; set; }
}

Большое спасибо.

1 Ответ

0 голосов
/ 29 апреля 2018

Вложенные запросы часто являются плохой идеей, поскольку базовый считыватель данных может вызвать конфликты, когда вы хотите прочитать результат, в то время как другой результат в настоящее время читается.

Не зная слишком много о настройке ваших данных, я бы порекомендовал вам полностью разделить это. Итак, вы сначала запрашиваете продукты, а затем запрашиваете все фотографии и объединяете их с моделями представлений:

// load all products
var products = await _context.product
        .Select(prod => new ProductViewModel() {
            id = prod.id,
            name = prod.name,
            description = prod.description,
            rating = prod.rating,
            price = prod.price,
        })
        .ToListAsync();

// find all product photos
var productIds = products.Select(p => p.id).Distinct().ToList();
var photos = await _context.product_photo
        .Where(photo => productIds.Contains(photo.product_id))
        .Select(photo => new ProductPhotoViewModel()
        {
            product_id = photo.product_id,
            path = photo.path
        })
        .ToListAsync();

// match photos to products
foreach (var product in products)
{
    product.photos = photos.Where(photo => product_id == product.id).ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...