从带有linq的联接表中选择

时间:2019-02-12 21:58:29

标签: linq

我有三个表:

1-表Car_Types

 _____________________
|   Id  |    Name    |
|____________________|
|   1   |  Pickup    |   
|   2   |  Sedan     |
|   3   |  Minivan   | 
|   4   |   SUV      |
|____________________|

2-表Car_Options

_________________________________________________
|   Id  |    Car_Type_Id     |      Company_Id   |
_________________________________________________|
|   1   |          1         |       Null        |
|   2   |          2         |       Null        |
|   3   |          3         |       Null        |
|   4   |          4         |       Null        |
|   5   |          1         |         1         |
|   6   |          2         |         1         |
|________________________________________________|

3-与表car_types类似的表公司

所以我想使用linq来选择所有car_options,而事情是:查询中有一个Company_Id X,所以我希望所有car_options(4)与{ {1}},但如果Company_Id == X之一没有car_option白色company_id == x,那么我要那个car_type_ids与那个car_option和{{ 1}}。我认为我需要加入,但我不知道该怎么做。

因此,如果company_id为1,则我想要的结果将是:

car_type_id

1 个答案:

答案 0 :(得分:0)

您的问题有些复杂-让我们从这里开始。

您想查找所有具有company_ID x的内容,因此从简单的linq查询开始:

car_options.Where(c => c.Company_Id == X);

然后,您还想获取没有Company_Id但具有与x匹配的car_type_id的任何内容,因此请添加到您的查询中

car_options.Where(c => c.Company_Id == X || (c.Company_Id == null && c.car_type_id == x))

然后,您只想接收与公司ID匹配的公司(如果存在)。因此,请按公司ID对它们进行分组,并按公司ID降序对这些组进行排序,因此,如果有具有(非空)公司ID的组将是第一个(否则只有一个组-空公司ID)

car_options.Where(c => c.Company_Id == X || (c.Company_Id == null && c.car_type_id == x))
    .GroupBy(c => c.Company_ID)
    .OrderByDescending(g => g.Key)
    .FirstOrDefault();

这将返回一个IGrouping,您可以使用它与IEnumerable相同(它只是一个密钥,如果您要查看是否是空公司ID或与x匹配的公司ID,这可能很方便。

根据更明确的要求进行编辑:

car_options.GroupBy(c => c.car_type_id)
    .Select(g => g.Where(c => c.Company_ID == X || c.Company_Id == null)
                      .OrderByDescending(c => c.Company_ID)
                      .FirstOrDefault());