选择Linq选择

问题描述 投票:0回答:2

您好我只想知道如何使用linq正确编写实体。我有一个案例:

select * from Contacts
 where PersonalNumber in (
 SELECT c.PersonalNumber
 from contacts c
 group by c.PersonalNumber
 having count(c.PersonalNumber)=1)

并想与Linq一起写:

var PersonalCounts = from c in contacts
                                     group c by c.PersonalNumber into g
                                     select new {PersonalCount = g.Count() };
                var contacts =
                    contacts
                    .Where(s => s.PersonalNumber = (PersonalCounts = 1))
                    .Select(s => s.First());

我只需要选择个人数量= 1的数据。有人可以帮助我吗?

c# linq
2个回答
5
投票

你是在思考这个问题。我们将其分解为两个步骤。首先,按编号对联系人进行分组:

var q1 = from c in contacts 
         group c by c.PersonalNumber;

好的,我们现在有一系列组,其中每组是一系列具有相同编号的联系人。

现在,我们希望序列中只有一个联系人的组,我们希望该联系人:

var q2 = from g in q1 
         where g.Count() == 1 
         select g.First();

或者,我们可以使用select-many从列表中提取单个联系人:

var q2 = from g in q1 
         where g.Count() == 1 
         from c in g
         select c;

我们已经完成了;我们可以在这里停下来如果我们想要,我们怎么能把它变成一个查询?

我们注意到我们正在将q1送入q2,所以我们可以将它们组合成这样:

var q = from g in (
          from c in contacts 
          group c by c.PersonalNumber) 
         where g.Count() == 1 
         select g.First();

但这实际上更难以阅读。在这种情况下,最好使用into查询延续:

var q = from c in contacts
        group c by c.PersonalNumber into g
        where g.Count() == 1
        select g.First();

或者,使用select-many:

var q = from c in contacts
        group c by c.PersonalNumber into g
        where g.Count() == 1
        from c in g
        select c;

我们已经完成了;我们有一系列联系人,每个联系人的号码只出现一次。

查询延续的好处是每个操作的运行顺序与页面上显示的顺序相同:

  • 我们从联系人开始
  • 我们将他们分组
  • 我们过滤组
  • 我们从其余组中提取联系人

这就是LINQ查询中您想要的:您希望查询中项的顺序与发生在数据集合中的操作的逻辑顺序相匹配。

请注意,我最后的“理解”格式解决方案在逻辑上与Anu Viswam的答案中的“流畅”形式完全相同。我喜欢在方便的时候使用理解语法,但很多人更喜欢流利的形式;选择对你最有意义的人。


4
投票

你可以使用以下。

contacts
    .GroupBy(x=> x.PersonalNumber)
    .Where(x=>x.Count()==1)
    .SelectMany(x=>x);
© www.soinside.com 2019 - 2024. All rights reserved.