Linq中的多表连接和分组

时间:2017-04-22 15:55:17

标签: c# sql asp.net linq

我有4张桌子没有任何其他FK:

  

表1:Id,数字,日期,价格

     

表2:Id,Number,Date,Price,Table1Number,Table1Date

     

表3:Id,Number,Date,Price,Table2Number,Table2Date

     

表4:Id,Number,Date,Price,Table3Number,Table3Date

我想要这个输出:

  

Table1.Number,Table1.Date,Table1.Price,

     

Table2.Number,Table2.Date,Table2.Price(Sum Price)

     

Table3.Number,Table3.Date,Table3.Price(Sum Price)

     

Table4.Number,Table4.Date,Table4.Price(Sum Price)

table1-table2是One-One关系,但table2-table3和table3-table4是One-Many。

我很困惑加入Linq并获得任何桌子的总价!

1 个答案:

答案 0 :(得分:0)

这可能不太有帮助。您可以做的是使用LinqPad尝试查询。使用此代码,我能够获得4个表并获得不同表的总数。 Table1和Table2的总和只是1记录的价格。 Table3的总和是属于Table1和Table2的所有记录的总和。表4有2个总计,因为表3与2个表4有关系。

如果你提供更多细节,我可以帮助你。

    void Main()
   {

    var tables4a = new List<Table4>(){new Table4{id=1, price=40}, new Table4{id=2, price=41}};
    var tables4b = new List<Table4>(){new Table4{id=1, price=50}, new Table4{id=2, price=51}};
    var tables3 = new List<Table3>(){new Table3{id=1, price=20, tables4= tables4a}, new Table3{id=2, price=21, tables4 = tables4b}};
    var tables2 = new List<Table2>() {new Table2(){id=1, price=5, tables3= tables3, table1= new Table1(){
    id = 1, price = 11
    }}};


    var Total123 = tables2.Where(x=>x.id ==1)
    .SelectMany(x=>x.tables3, (table2,b)=>new{
    table2
    })
    .SelectMany(x=>x.table2.tables3, (table_2,table_3)=>new{
    table_2,
    table_3
    })
    .Select(v=> new {
    SumTable1= v.table_2.table2.table1.price,
    SumTable2= v.table_2.table2.price,
    SumTable3 =v.table_2.table2.tables3.Sum(x=>x.price),
    SumTable4= v.table_3.tables4.Sum(x=>x.price),
        })
        .Distinct()
    ;

    Total123.Dump();
}


public class Table1
{
    public int id {get;set;}
    public int price {get; set;}
}

public class Table2
{
    public int id {get;set;}
    public int price {get; set;}
    public Table1 table1 {get; set;}
    public List<Table3> tables3 {get; set;}
}

public class Table3
{
    public int id {get;set;}
    public int price {get; set;}
    public List<Table4> tables4 {get; set;}
}

public class Table4
{
    public int id {get;set;}
    public int price {get; set;}
}

enter image description here