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);
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);