【问题标题】:Select inside a select using lambda expressions使用 lambda 表达式在选择内选择
【发布时间】:2018-04-29 15:01:16
【问题描述】:

朋友们,

我试图在我的 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; }
}

非常感谢。

【问题讨论】:

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

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


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多