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

时间:2015-01-20 09:22:35

标签: c# asp.net linq entity-framework

我在数据库中有两个表:

  1. PostCalculationLine
  2. PostCaluclationLineProduct
  3. PostCalculationLineProduct(table2)包含PostCalucationLineId(table1)的Foriegn键

    在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);
    

    在上面的查询中,我希望得到标有underLine的PostCalculationLineId(来自Table1)。我怎样才能做到这一点?

    由于

1 个答案:

答案 0 :(得分:3)

您可以使用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列表并返回与每个PostCalculationLine元素相结合的展平列表。