1

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

我的数据库上有这张表:

在此处输入图像描述

SentBySentTo列是用户表的 FK。

我想获取已向另一个用户发送消息的用户,但我只想获取一次。为此,我使用以下 SQL 语句:

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

我这样做是order by DateUtcSent DESC;为了先发送最新消息。

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

但我明白了:

在此处输入图像描述

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

我不需要最后一行。

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

我怎样才能不多次获得 sentBy 值?

更新

而且,如果我想这样做:

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

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

我该怎么做?

4

3 回答 3

2

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

于 2017-12-12T12:36:37.487 回答
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});
于 2013-10-29T09:30:55.647 回答
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();

您按发件人分组,按日期排序,然后只取第一个。

于 2013-10-29T09:32:42.210 回答