EF 计数重复字段值的实例

EF Count instances of duplicate field value

EntityFramework 是否提供任何机制来查找某个值在列中重复的次数?我知道纯 SQL 中的 grouping/counting,但我不确定如何将其转换为 EF Lambda 表达式。

该项目在 .NET4 上使用 EF5

Run the snippet below to see desired output

<h3>Original Table</h3>
<table border="1">
  <thead>
    <tr>
      <th>
        Some Column
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>asdf</td>
    </tr>
    <tr>
      <td>asdf</td>
    </tr>
    <tr>
      <td>fdsa</td>
    </tr>
    <tr>
      <td>fdsa</td>
    </tr>
    <tr>
      <td>fdsa</td>
    </tr>
  </tbody>
</table>

<h3>Desired Table</h3>
<table border="1">
  <thead>
    <tr>
      <th>Some Column</th>
      <th>Count</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>asdf</td>
      <td>2</td>
    </tr>
    <tr>
      <td>fdsa</td>
      <td>3</td>
    </tr>
  </tbody>
</table>

您将要像这样使用 LINQ 语法:

from item in Table
group item by item.FieldName into g
select new {Key = g.Key, Count = g.Count()}

将 Table 替换为您的 EntitySet 名称,将 FieldName 替换为您要分组的 属性。

编辑: 并请求 Lambda 语法:

Table.GroupBy(l => l.FieldName , l => l, (key,g) => new {Key = key, Count=g.Count()})

我不会显示你原来的 table 的 POCO,但可以从你的问题中看出它至少有一个 "Some Column" 属性:

// a list, simulating your table, and seeded with values from your example
var originalData = new List<OriginalTable>
{
    new OriginalTable {SomeColumn = "asdf"},
    new OriginalTable {SomeColumn = "asdf"},
    new OriginalTable {SomeColumn = "fdsa"},
    new OriginalTable {SomeColumn = "fdsa"},
    new OriginalTable {SomeColumn = "fdsa"},
};

以下将 return key 属性 中具有不同值 SomeColumn 的对象集合,以及 originalData 中该值的计数] 在 count 属性:

var desiredTable = originalData.GroupBy(o => o.SomeColumn,
                                        o => 1, // don't need the whole object
                                        (key, g) => new {key, count = g.Sum()});

当然,您可以在第二个参数中 return 组 select 中的整个对象,但这太过分了,因为您只是要数数 returned.

你可能会想在字典中找到它——无论如何用 GroupBy 做这件事很常见——所以我也把它扔在那里:

var desiredDictionary = desiredTable.ToDictionary(x => x.key, x => x.count);