LINQ 加入分组依据

LINQ Join with Group By

我有一个 table 结构,如下所示

Table_A

 Id      Description 

 1           A
 2           B
 3           C
 4           D

Table_B

 Table_A_Id   Id    Description

    1          1        A
    1          2        B
    2          3        C
    2          4        D
    3          5        E
    3          6        F
    4          7        G
    4          8        H
    4          9        I
    4         10        J

我想以某种方式加入他们以获得以下列表Class

 Public Resultset
{
     public Table_A table_a {get;set;}
     public List<Table_B> table_b {get;set;}
}

// 假设我们有 类 用于 Table_A 和 Table_B 根据他们的 table 定义

以下是我的尝试

var filter [] = {1,3,5}; 

var query = from  a in context.Table_A
            joins b in context.Table_B
            on a.Id equals b.Table_A_id
            where filter.Contains(b.Id) 
            // Need something here perhaps to group it to get desired results
            Select new ResultSet()
            {
              // what to do here
            }

您可以尝试以下群组:

var query = from  a in context.Table_A
            joins b in context.Table_B
            on a.Id equals b.Table_A_id
            where filter.Contains(b.Id) 
            group new{A=a, B=b } by a.Id into g
            select new ResultSet()
            {
               table_a=g.FirstOrDefault().A,
               table_b=g.Select(e=>e.B).ToList()
            };

另一种方式,如果您在这些实体之间使用 navigation properties

var query = from  b in context.Table_B
            where filter.Contains(b.Id)
            group b by b.Table_A_id into g
            select new ResultSet()
            {
               table_a=g.FirstOrDefault().A,
               table_b=g.ToList()
            };

我认为你需要一个简单的 Group Join:

var filter = new [] { 1, 3, 5 }; 

var query = from  a in context.Table_A
            join b in (from b in context.Table_B where filter.Contains(b.Id) select b)
            on a.Id equals b.Table_A_id into items_B
            select new ResultSet
            {
                table_a = a,
                table_b = items_B.ToList()
            };