Linq查询正确的方法

时间:2014-02-25 08:09:47

标签: c# .net linq

我想要一份名列相同的人名单,但在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个,那么只有我应该收到两个对象。该类别中应存在相同的名称。

3 个答案:

答案 0 :(得分:7)

我怀疑您只需要撤销wheregroup 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")