我正在使用C#和.NET Framework 4.0开发实体框架代码优先库。
我的数据库中有这个表:
SentBy
和SentTo
列是用户表的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;
然后,合并两个结果而不重复用户并获取最后一条消息。
我该怎么做?
答案 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();
您按发件人分组,按日期排序,只选择第一个。