首页 > 解决方案 > LINQ 根据计数 >1 的另一列获取列

问题描述

我正在努力通过使用 Entity Framework Core 从数据库中查询 B 列的重复项来获取 A 列的值。例子:

Column A | Column B
--------------------
A        | 1
B        | 1 
C        | 2 
D        | 2 
E        | 3 

我应该得到输出:

A,B,C,D

我打算用它来填充下拉列表。

我试过了:

Options = _context.table.AsEnumerable()
.GroupBy(s => new{ s.columnA,s.columnB)
.Where(o => o.columnB.Count() > 1)
.Select(o => new SelectListItem
{
   Value = o.Key.columnA,
   Text = o.Key.columnB
}.ToList()

标签: c#linqasp.net-coreentity-framework-core

解决方案


你只想指望columnB你应该使用.GroupBy(s => s.columnB). 更新您的Where&Select如下所示。

注意需要在里面使用SelectManywith Select,因为如果我们使用Select而不是SelectMany它会返回List<List<SelectListItem>>. SelectMany将其压平并返回List<SelectListItem>

Options = _context.table.AsEnumerable()
            .GroupBy(s => s.columnB)
            .Where(o => o.Count() > 1)
            .SelectMany(o => o.Select(x => new SelectListItem
            {
               Value = x.columnA,
               Text = x.columnB
            }))
            .ToList();

来自有用评论的详细解释 归功于@Flater。 lambda inGroupBy本质上是“组标识符”。在问题中,每个组由 A 列B 列的组合唯一性定义。但是根据所描述的问题,它需要仅基于 B 列组合事物,目标是对事物进行专门分组,而不管A 列包含什么,所以列 A 不应包含在组的标识符中,因为查询在遇到不同的列 A 值时不应创建新组。


推荐阅读