我有以下场景可以在数据库级别或Linq到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的不同记录由于
答案 0 :(得分:1)
编辑 - 根据更新,您希望通过ID
进行区分完整文章:DistinctBy in Linq (Find Distinct object by Property)
以下是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
答案 1 :(得分: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