如何使用 group by 和 order by LINQ DataTable 来删除重复数据
How to LINQ DataTable with group by and order by to deduplicate data
我有以下数据表
Col1
Col2
Col3
A
B
1
A
B
2
A
C
1
Col1 和 Col2 是唯一键,所以第一行和第二行是重复的。
Col3 不同所以我想有一个选项来设置条件到 select。例如,条件可以是 Take grouped row where Col3 is greatest。结果会是。
Col1
Col2
Col3
A
B
2
A
C
1
如何为此使用 LINQ?我尝试了以下变体
数据表设置
var datatable = new DataTable();
datatable.Columns.Add("Col1");
datatable.Columns.Add("Col2");
datatable.Columns.Add("Col3");
// this row should not be in the result
var row1 = datatable.NewRow();
row1.ItemArray = new[] { "A", "B", "1" };
datatable.Rows.Add(row1);
var row2 = datatable.NewRow();
row2.ItemArray = new[] { "A", "B", "2" };
datatable.Rows.Add(row2);
var row3 = datatable.NewRow();
row3.ItemArray = new[] { "A", "C", "1" };
datatable.Rows.Add(row3);
查询尝试
可以是query expression,也可以是fluent based,无所谓。
var result =
from record in datatable.AsEnumerable()
group record by new { record.Field<string>("Col1"), record.Field<string>("Col2") } into g
let row =
(
from groupedItem in groupedItems
order by groupedItem.Field<string>("Col3") desc
select groupedItem
).First()
select row;
当有record.Field时,我得到一个异常
Invalid anonymous type member declarator
我对复杂的 LINQ 查询没有经验,我该如何解决这个问题?
编译器似乎无法推断数据表中列的类型,请尝试在匿名属性中命名它们,例如:
group record by new
{
Col1 = record.Field<string>("Col1"),
Col2 = record.Field<string>("Col2")
}
感谢@Ehsan Sajjad 的工作解决方案是
var result =
from record in datatable.AsEnumerable()
group record by new {
Col1 = record.Field<string>("Col1"),
Col2 = record.Field<string>("Col2"),
} into g
let selectedItem =
(
from item in g
orderby item.Field<string>("Col3") descending
select item
).First()
select selectedItem;
我有以下数据表
Col1 | Col2 | Col3 |
---|---|---|
A | B | 1 |
A | B | 2 |
A | C | 1 |
Col1 和 Col2 是唯一键,所以第一行和第二行是重复的。 Col3 不同所以我想有一个选项来设置条件到 select。例如,条件可以是 Take grouped row where Col3 is greatest。结果会是。
Col1 | Col2 | Col3 |
---|---|---|
A | B | 2 |
A | C | 1 |
如何为此使用 LINQ?我尝试了以下变体
数据表设置
var datatable = new DataTable();
datatable.Columns.Add("Col1");
datatable.Columns.Add("Col2");
datatable.Columns.Add("Col3");
// this row should not be in the result
var row1 = datatable.NewRow();
row1.ItemArray = new[] { "A", "B", "1" };
datatable.Rows.Add(row1);
var row2 = datatable.NewRow();
row2.ItemArray = new[] { "A", "B", "2" };
datatable.Rows.Add(row2);
var row3 = datatable.NewRow();
row3.ItemArray = new[] { "A", "C", "1" };
datatable.Rows.Add(row3);
查询尝试
可以是query expression,也可以是fluent based,无所谓。
var result =
from record in datatable.AsEnumerable()
group record by new { record.Field<string>("Col1"), record.Field<string>("Col2") } into g
let row =
(
from groupedItem in groupedItems
order by groupedItem.Field<string>("Col3") desc
select groupedItem
).First()
select row;
当有record.Field时,我得到一个异常
Invalid anonymous type member declarator
我对复杂的 LINQ 查询没有经验,我该如何解决这个问题?
编译器似乎无法推断数据表中列的类型,请尝试在匿名属性中命名它们,例如:
group record by new
{
Col1 = record.Field<string>("Col1"),
Col2 = record.Field<string>("Col2")
}
感谢@Ehsan Sajjad 的工作解决方案是
var result =
from record in datatable.AsEnumerable()
group record by new {
Col1 = record.Field<string>("Col1"),
Col2 = record.Field<string>("Col2"),
} into g
let selectedItem =
(
from item in g
orderby item.Field<string>("Col3") descending
select item
).First()
select selectedItem;