用Linq选择

时间:2018-12-05 23:46:26

标签: c# linq

你好,我只是想知道如何使用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的数据。 有人可以帮我吗?

2 个答案:

答案 0 :(得分: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();

或者,使用多次选择:

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回答中的“流利”格式完全相同。我更喜欢在方便时使用理解语法,但是许多人更喜欢流利的形式。选择最适合您的那个。

答案 1 :(得分:4)

您可以使用以下内容。

contacts
    .GroupBy(x=> x.PersonalNumber)
    .Where(x=>x.Count()==1)
    .SelectMany(x=>x);