LINQ 在哪里存在 GROUP BY

Posted

技术标签:

【中文标题】LINQ 在哪里存在 GROUP BY【英文标题】:LINQ Where Exists GROUP BY 【发布时间】:2011-04-03 16:24:22 【问题描述】:

如何在 LINQ 中进行转换?

SELECT B.SENDER, B.SENDNUMBER, B.SMSTIME, B.SMSTEXT
FROM MESSAGES B
WHERE EXISTS ( SELECT A.SENDER
        FROM MESSAGES A
    WHERE A.SENDER = B.SENDER
    GROUP BY A.SENDER
    HAVING B.SMSTIME = MAX( A.SMSTIME))
GROUP BY B.SENDER, B.SENDNUMBER, B.SMSTIME, B.SMSTEXT ;

非常感谢:)

编辑!!

解决方法:

  var Condition = "order by SMSTime desc";      

  IEnumerable<ClassMessaggio> messaggi = Database.Select<ClassMessaggio>(Condition);; // Load all but sorted

  ElencoConversazioni =  messaggi.GroupBy(m => new  m.Number )
                .Select(g => g.OrderByDescending(m => m.SMSTime).First()).ToObservableCollection();

【问题讨论】:

外部GROUP BY 是干什么用的?你想做什么? 我有一些联系人的消息列表,我需要显示每个联系人的最后一条消息的“对话”列表。 【参考方案1】:

试试

db.Messages.Where(b => b.SmsTime == Messages.Where(a => a.Sender == b.Sender)
                                            .Max(a => a.SmsTime))

或者

db.Messsages.GroupBy(m => new  m.Sender, m.SendNumber )
            .Select(g => g.OrderByDescending(m => m.SmsTime).First())

db 是您的 DataContext。

【讨论】:

我的表是“ClassMessaggio”,所以我用 ClassMessaggio 替换 Messages,但它给了我:“JackSMS.ClassMessaggio 在位置 15 的类中没有字段或方法 'ClassMessaggio'” 嗯?您需要在实例上运行它(它不是static 方法)。使用 DataContext。 我有这个: var condition = "ClassMessaggio.GroupBy(m => new m.Sender, m.SendNumber, m.OtherThings).Select(g => g.OrderByDescending(m = > m.SmsTime).First())"; ElencoConversazioni = Database.Select(条件).ToObservableCollection();我哪里错了? uhm.. 但它的工作条件很简单:Conversazione = Database.Select("Number='" + Number + "' order by SMSTime asc").ToObservableCollection();我会读一读,谢谢.. 嗯?你到底在用什么?这听起来像 LINQ。【参考方案2】:

要显示对话列表以及“每个联系人的最后一条消息”,您可以尝试以下操作:

// a query to find the last Sms time per sender
var lastSmsQuery = from m in db.messages
                 group m by m.Sender into grouping
                 select new
                 
                     Sender = grouping.Key,
                     LastSmsTime = grouping.Max(x => x.SmsTime)
                 ;

// a query to find the messages linked to the last Sms per sender
var lastMessageQuery = from m in db.messages
                       join l in lastSmsQuery on new  m.Sender, m.SmsTime  equals new  l.Sender, l.LastSmsTime 
                       select m;

使用的 2-query 方法类似于今天早些时候的这个问题 - Convert SQL Sub Query to In to Linq Lambda

【讨论】:

正如我对另一个答案的理解,我认为问题是我不需要将 LINQ 与 Perst DB 完全结合使用。我会尝试从数据库中找到我必须用于查询的内容,我会再次提问。感谢您的帮助;) 从未使用过 Perst - 但 Bing 告诉我它可以支持一些 Linq 查询 - 祝你好运!

以上是关于LINQ 在哪里存在 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

C# Linq group by 和 group by into 运用实例

如何在 LINQ to Entities 中执行 SQL“在哪里存在”?

在SQL中分组查询 Group by 的存在条件是啥

linq中group by

linq中group by

Linq中的group by多表多字段