使用lambda表达式在select中选择

时间:2018-04-29 15:01:17

标签: c# entity-framework lambda asp.net-core

我试图在我的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()内部子选择它只是一次尝试失败的尝试。我决定坚持这个问题只是说'我已经尝试过了,但是没有工作'

我如何选择一个系列?如果此集合有另一个子集合,也可以选择它?

修改

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 :(得分:1)

嵌套查询通常是一个坏主意,因为当您想要读取结果而当前正在读取其他结果时,底层数据读取器可能会导致冲突。

我不太了解您的数据设置,我建议您完全拆分它。因此,您首先查询产品,然后查询所有照片并将其合并到视图模型中:

// 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();
}