与 LINQ 中的 SelectMany 函数相关的问题

Issue Related to SelectMany function in LINQ

我在数据库中有两个表:

  1. 后计算线
  2. 后计算线产品

PostCalculationLineProduct(table2) 包含 PostCalucationLineId(table1) 的外键

在 C# 代码中,我对这两个表有两个不同的模型,如下所示:

public class PostCalculationLine : BaseModel
{
    public long Id{ get; set; }
    public string Position { get; set; }
    public virtual Order Order { get; set; }
    public virtual Task Task { get; set; }
    //some other properties go here
    public virtual IList<PostCalculationLineProduct> PostCalculationLineProducts { get; set; }
}

 public class PostCalculationLineProduct : BaseModel
 {
    public long Id {get;set;}
    public string Description { get; set; }
    //some other properties go here
}

现在在 Entityframework 代码中,我从 PostCalculationLineProduct 获取数据如下:

PostCalculationLineRepository pclr = new PostCalculationLineRepository();
DataSourceResult dsrResult = pclr.Get()
    .SelectMany(p => p.PostCalculationLineProducts)
    .Where(c => c.Product.ProductType.Id == 1 && c.DeletedOn == null)
    .Select(c => new HourGridViewModel()
         {
            Id = c.Id,
            Date = c.From,
            EmployeeName = c.Employee != null ?c.Employee.Name:string.Empty,
            Description= c.Description,
            ProductName = c.Product != null?c.Product.Name :string.Empty,
            From = c.From,
            To = c.Till,
            Quantity = c.Amount,
            LinkedTo = "OrderName",
            Customer ="Customer"
            PostCalculationLineId = ____________
        })
    .ToDataSourceResult(request);

在上面的查询中,我想获取标有下划线的 PostCalculationLineId(来自表 1)。我怎样才能做到这一点?

谢谢

您可以使用 SelectMany 的 this overload 来实现:-

  DataSourceResult dsrResult = pclr.Get()
                .SelectMany(p => p.PostCalculationLineProducts,
                (PostCalculationLineProductObj,PostCalculationLineObj) => 
                         new { PostCalculationLineProductObj,PostCalculationLineObj })
                .Where(c => c.PostCalculationLineProductObj.Product.ProductType.Id == 1 
                       && c.PostCalculationLineProductObj.DeletedOn == null)
                .Select(c => new HourGridViewModel()
                {
                    Id = c.PostCalculationLineProductObj.Id,
                    Date = c.PostCalculationLineProductObj.From,
                    //Other Columns here
                    PostCalculationLineId = c.PostCalculationLineObj.Id
                };

这将展平 PostCalculationLineProducts 列表和 returns 展平列表与每个 PostCalculationLine 元素的组合。