我想要一份名列相同的人名单,但在1960年之前或1970年之后都有出生年份。
这只是一个练习查询,我正在使用相交,通过它我只得到名字,但如果我想要人的整个对象怎么办。
我试过这个,这是有效的。
using Chapter01Samples;
var contacts = Contact.SampleData();
var callLog = CallLog.SampleData();
var result = from contact in contacts
group contact by contact.FirstName into person
where person.Any( c => c.DateOfBirth.Year > 1970)
&& person.Any(c => c.DateOfBirth.Year < 1960)
select person;
但如果有更好的查询,我想知道
编辑:如果有2个人名为亚当,而其中一个人出生58年,其中一个人有72个,那么只有我应该收到两个对象。该类别中应存在相同的名称。
答案 0 :(得分:7)
我怀疑您只需要撤销where
和group by
条款。首先过滤,然后分组:
var result = from contact in contacts
where contact.DateOfBirth.Year > 1970 ||
contact.DateOfBirth.Year < 1960
group contact by contact.FirstName;
请注意从&&
到||
的更改,以便我们只收集1960年以后出生的人或。
如果这不是您想要的,请提供更多详细信息。特别是,如果你试图找到“1960年以前出生的人与1970年以后出生的人至少有一个名字”,那么我会把它分成几个阶段。首先过滤并对用户进行分组,因此我们将1960年以前出生的人按名字分组,1970年以前出生的人按名字分组。然后,您可以对这些组执行内部联接,并且具有相同键(名字)的任何一对组的结果只是两个组成员的串联。
// No offence intended by these names...
var oldGroups = contacts.Where(contact => contact.DateOfBirth.Year < 1960)
.GroupBy(p => p.FirstName);
var youngGroups = contacts.Where(contact => contact.DateOfBirth.Year > 1970)
.GroupBy(p => p.FirstName);
var query = oldGroups.Join(youngGroups, og => og.Key, yg => yg.Key,
(og, yg) => og.Concat(yg));
答案 1 :(得分:1)
var contacts = Chapter01Samples.Contact.SampleData();
var query = contacts.Where(c => c.DateOfBirth.Year > 1970 || c.DateOfBirth.Year < 1960)
.GroupBy(c => c.FirstName);
答案 2 :(得分:0)
如果您使用数据表或数据集,那么它就像是
dataTable.Select("Your simple where clause and other clauses")
或者如果你使用
dataSet.Table[0].Select("Your simple where clause and other clauses")