C# 在“使用Linq选择”中选择
您好,我只是想知道如何正确地使用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
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)的东西谢谢你让我度过了一个美好的夜晚,我已经想了很久了。谢谢again@zura:LINQ查询表达式的技巧是将其分解为一系列逻辑步骤,并对每个步骤进行查询。然后把它们串在一起,然后看看你是否可以简化它。谢谢@Anu,这也是正确的。我不知道。这就是我犯错误的原因。我很感激