C# 使用lambda表达式在选择中选择
朋友们 我试图在ViewModel中选择一个集合,但我认为我这样做是错误的,因为当我在查询中保留子select时,我的端点进入一个无限循环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,
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
类的定义吗?