Linq条件记录组

时间:2015-10-30 10:54:56

标签: c# linq list

我在列表中有以下数据: -

╔════╤════════════╤════════╗
║ Id │ EmployeeId │ Answer ║
╠════╪════════════╪════════╣
║ 1  │ 6          │ 1      ║
╟────┼────────────┼────────╢
║ 2  │ 6          │ 4      ║
╟────┼────────────┼────────╢
║ 3  │ 7          │ 2      ║
╟────┼────────────┼────────╢
║ 4  │ 7          │ 4      ║
╚════╧════════════╧════════╝

现在,使用Linq,我想得到那些已回答1和4的“EmployeeId”(在答案栏中)。

我该怎么做...... ??

修改

实际上我想要那些已经回答4但不是1的员工。 在上面的示例中,EmployeeId 7

2 个答案:

答案 0 :(得分:2)

var answers = new[]{ 1, 4 };
var query = list
    .GroupBy(x => x.EmployeeId)
    .Where(g => answers.All(a => g.Any(x => x.Answer == a)))
    .Select(g => g.Key);

LINQ to Objects更高效:

var query = list
    .GroupBy(x => x.EmployeeId)
    .Where(g => !answers.Except(g.Select(x => x.Answer)).Any())
    .Select(g => g.Key);

或没有查找集合:

var query = list
    .GroupBy(x => x.EmployeeId)
    .Where(g => g.Any(x => x.Answer == 1) && g.Any(x => x.Answer == 4))
    .Select(g => g.Key);

修改:现在您希望所有EmployeeId的答案都是4而不是1

var query = list
    .GroupBy(x => x.EmployeeId)
    .Where(g => g.Any(x => x.Answer == 4) && !g.Any(x => x.Answer == 1))
    .Select(g => g.Key);

答案 1 :(得分:2)

使用Where仅选择想要的答案。然后使用Select选择员工ID。

var answers = new[]{1,4};

var result = list.Where(x => answers.Contains(x.Answer)).Select(x => x.EmployeeId).ToList();

如果您愿意,也可以使用Distinct删除重复项。

var result = list.Where(x => answers.Contains(x.Answer)).Select(x => x.EmployeeId).Distinct().ToList();

如果你想要除1和4之外的任何答案以及其他答案

var result = list.Where(x => x.Answer != 1).Select(x => x.EmployeeId).Distinct().ToList();