1

我有以下可以在数据库级别或 Linq to EF 级别解决的场景:这是我在数据库中的视图:

id  title   date           weight
==================================
1   t1     2013-01-18       1.5
1   t1     2013-01-17       1.4
1   t1     2013-01-15       1.31
1   t1     2013-01-12       1.22
2   t2     2013-01-19       2.3
2   t2     2013-01-16       2.1
2   t2     2013-01-07       1.81
2   t2     2013-01-19       1.62

因此,我需要的是每个项目(t1 和 t2)中的一条记录,这是按日期计算的最新记录。

所以输出将是这样的:

id  title   date           weight
==================================
1   t1     2013-01-18       1.5
2   t2     2013-01-19       2.3

正如我在上面所说的,在数据​​库级别或使用 (Distinct) 的 linq 级别的答案都受到欢迎。

我的 c# linq 的一部分:

mylist = (from a in db.myview
join art in db.viewTags on a.id equals art.ArticleID
where (art.TagID == tag.ID)
select a).Distinct().Take(10).ToList();

根据 a.id(视图的 id 字段),我需要来自 myview 的不同记录

谢谢

4

2 回答 2

1

即使同一日期有 2 个重量,以下内容也会为您提供一行:

declare @t table (
    id int,
    title varchar(50),
    date datetime,
    weight decimal(19,4)
)

insert into @t (id, title, date, weight) values
   (1, 't1', '20130118', 1.5),
   (1, 't1', '20130118', 1.6),
   (2, 't2', '20130116', 1.4),
   (2, 't2', '20130115', 1.2)

select
    *
from
    (
        select ROW_NUMBER() over (partition by id order by date desc) rn, * 
        from @t
    ) v
where rn = 1
于 2013-01-22T17:30:42.320 回答
1

编辑- 根据您希望通过 id 区分的更新

全文:Linq 中的 DistinctBy(按属性查找不同的对象)

以下是MoreLINQ库的一部分。

使用DistinctBy功能

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

因此,要仅使用该属性来查找不同的值Id,您可以使用:

mylist = (from a in db.myview
 join art in db.viewTags on a.id equals art.ArticleID
 where (art.TagID == tag.ID)
 select a).DistinctBy(a=>a.Id).Take(10).ToList();

select * from table 
inner join
(select max(date) as date,id from table group by id) d 
on d.id = table.id and d.date= table.date
于 2013-01-22T17:15:04.380 回答