我有三个表:
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
答案 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());