Linq to SQL / filter duplicates

时间:2014-07-16 21:03:44

标签: c# sql linq filter sql-server-2012

我在我的sql server 2012中有一个重复的视图,我想用最新的方式对它们进行排序并过滤所有其他的 - 有人可以帮助我吗?

我在SQL Server 2012中的观点:

GUID(作为主键),号码,日期时间和名称

+-----+----------+--------------------------------+-----
| guid  |  number| datetime                       | name
+-----+----------+--------------------------------+------
| b105..| 1234567|2014-07-07T16:32:20.854+02:00:00|Name1
| s1b5..| 1111222|2014-07-06T16:30:21.854+02:00:00|Name2
| b17a..| 1234567|2014-07-06T15:22:17.854+02:00:00|Name1
| f205..| 1233333|2014-07-07T17:40:20.854+02:00:00|Name3
| b11t..| 1233333|2014-07-04T11:12:15.854+02:00:00|Name3
| rt85..| 1111222|2014-07-07T21:55:52.854+02:00:00|Name2
+-------+--------+--------------------------------+-----

如果数字相同,则每次都是相同的名称。例如编号1234567始终为名称1。

我想过滤我的表格,我只有最新的号码,没有重复

所以结果应该是:

+-----+----------+--------------------------------+-----
| guid  |  number| datetime                       | name
+-----+----------+--------------------------------+------
| b105..| 1234567|2014-07-07T16:32:20.854+02:00:00|Name1
| f205..| 1233333|2014-07-07T17:40:20.854+02:00:00|Name3
| rt85..| 1111222|2014-07-07T21:55:52.854+02:00:00|Name2
+-------+--------+--------------------------------+-----

我如何在Linq中执行此操作? "鲜明"由于guid和日期时间不起作用

2 个答案:

答案 0 :(得分:0)

var res = list.GroupBy(c => c.name).Select(group => group.OrderBy( c1 => c1.datetime).First()).ToList();

只要将datetime存储为DateTime的实例而不是字符串,这应该有效。

答案 1 :(得分:0)

您可以通过将元素分组为2列来实现。 (号码和名称)。然后访问分组数据。你可以这样做:

var query =
        from col in viewData
        group col by new
    {
        col.name,
        col.number,

    } into groupedCol
    select new viewData()
    {
        number = groupedCol.Key.number,
        name = groupedCol.Key.name,
        datetime = groupedCol.OrderBy( dateCol => dateCol.datetime).First()

    };