仅使用Entity Framework Code First在一列上选择distinct

时间:2013-10-29 09:26:08

标签: c# sql sql-server entity-framework

我正在使用C#和.NET Framework 4.0开发实体框架代码优先库。

我的数据库中有这个表:

enter image description here

SentBySentTo列是用户表的FK。

我想让已经向其他用户发送消息的用户,但我只想获得一次。为此,我使用此SQL语句:

select distinct SentBy, DateUtcSent
  from Messages where isAFriendshipRequest = 0 and SentTo = 15
order by DateUtcSent DESC;

我执行order by DateUtcSent DESC;以获取最先发送的最新消息。

我们的想法是为每个向用户15发送消息的用户获取一行。

但我明白了:

enter image description here

如您所见,我两次获得用户2。

我不需要最后一行。

在这里,我试图让每个向用户15发送消息的不同用户,并在结果上获取用户ID,dateUtcSent和正文。

如何才能多次获取sentBy值?

更新

而且,如果我想这样做:

select distinct SentTo, DateUtcSent
  from Messages where isAFriendshipRequest = 0 and SentBy = 15
order by DateUtcSent DESC;

然后,合并两个结果而不重复用户并获取最后一条消息。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以使用DistinctBy(m=> m.SentBy)

答案 1 :(得分:1)

在我们的合作社之后,最终的查询是:

var query =
    context.Messages
    .Where(x => x.IsAFriendshipRequest == false && x.SentTo == userId).Include("SentByUser")
    .Select(x => new { User = x.SentBy, x.DateUtcSent, x.Body, Name = x.SentByUser.Name })
    .Union
    (
        context.Messages
        .Where(x => x.IsAFriendshipRequest == false && x.SentBy == userId).Include("SentToUser")
        .Select(x => new { User = x.SentTo, x.DateUtcSent, x.Body, Name = x.SentToUser.Name })
    )
    .GroupBy(x => new {x.User, x.Name})
    .Select(x => new { User = x.Key.User, DateUtcSent = x.Max(z => z.DateUtcSent), Body = x.Where(z => z.DateUtcSent == x.Max(d => d.DateUtcSent)).Select(z=>z.Body ).SingleOrDefault(), Name = x.Key.Name});

答案 2 :(得分:0)

你的查询是SQL,但我知道你需要一个Linq To Sql查询,所以这里是:

var q = from message in Messages 
        where message.isAFriendshipRequest = 0 
        && message.SentTo = 15
        group message by message.SentBy into grp
        select grp.OrderByDescending(m => m.DateUtcSent).First();

您按发件人分组,按日期排序,只选择第一个。