C# 使用lambda表达式在选择中选择

C# 使用lambda表达式在选择中选择,c#,entity-framework,lambda,asp.net-core,C#,Entity Framework,Lambda,Asp.net Core,朋友们 我试图在ViewModel中选择一个集合,但我认为我这样做是错误的,因为当我在查询中保留子select时,我的端点进入一个无限循环 var products = await _context.product .Select(prod => new ProductViewModel() { id = prod.id, name = prod.name, description = prod.description,

朋友们

我试图在ViewModel中选择一个集合,但我认为我这样做是错误的,因为当我在查询中保留子select时,我的端点进入一个无限循环

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;
}
public class ProductPhotoViewModel
{
    public string product_id { get; set; }
    public string path { get; set; }
}

非常感谢。

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

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

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

你没有在模型中定义关键关系吗?是的,我有。我只是没有把它放在问题中,而是放在
Where()
中,你可以看到它。顺便说一下,我已经编辑了这个问题。然后使用实体框架加载相关实体并转换为视图模型。不要循环浏览每种产品的照片。你怎么知道它处于无限循环中?看起来您正试图将整个
产品
表和许多
产品_照片
表加载到
产品
变量中。这不是一种可伸缩的方式。您能告诉我们您的
ProductPhotoViewModel
类的定义吗?