Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在“使用Linq选择”中选择_C#_Linq - Fatal编程技术网

C# 在“使用Linq选择”中选择

C# 在“使用Linq选择”中选择,c#,linq,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

您好,我只是想知道如何正确地使用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的数据。
有人能帮我吗?

你想得太多了。让我们把它分成两个步骤。首先,按号码将联系人分组:

var q1 = from c in contacts 
         group c by c.PersonalNumber;
好的,我们现在有一个组序列,其中每个组都是一个具有相同编号的联系人序列

现在,我们想要序列中有一个联系人的组,我们想要该联系人:

var q2 = from g in q1 
         where g.Count() == 1 
         select g.First();
或者,我们可以使用“选择多个”从列表中提取单个联系人:

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();
但这实际上更难阅读。在这种情况下,最好使用带有
的查询延续到

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回答中的“流畅”格式完全相同。我倾向于在方便的时候使用理解语法,但很多人更喜欢流利的形式;选择对您最有意义的选项。

您可以使用以下选项

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

我怀疑您想要类似于
PersonalCounts.Where(z=>z.Count()==1)的东西