2014-02-25 55 views
0

我想的誰共享相同的名字的人的名單,但有出生年份1960年或者之前或之後,1970年Linq查詢正確的方式

它僅僅是一個實踐的查詢,我是用交叉的工作,通過它我得到的只是名字,但如果我想要人的全部對象,該怎麼辦?

我試過這個,這是工作。

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個,那麼只有我應該接受兩個對象。這兩個類別都應該有同名。

回答

7

我懷疑你只是需要扭轉你的wheregroup by子句。過濾器,然後再組:

var result = from contact in contacts 
      where contact.DateOfBirth.Year > 1970 || 
        contact.DateOfBirth.Year < 1960 
      group contact by contact.FirstName; 

注意從&&||的變化,所以我們只有在1970年

收集誰出生的人或者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)); 
+0

犯規這一說法contact.DateOfBirth.Year> 1970年&& contact.DateOfBirth 。<1960年意味着同一個人的dob應該> 1970年和<1960年,這是不可能的 –

+0

對不起,這是以前的評論,在目前的情況下,它會給我的名字甚至如果只有一個人的dob> 1970年或<1960年......此外,如果有兩個人,都> 1970年,他們將被包括在內 –

+0

@ZaidBinIrfan:是的,會的。這聽起來像你沒有正確解釋你的要求。如果您可以提供樣本輸入和預期輸出,這將有所幫助。 –

1
var contacts = Chapter01Samples.Contact.SampleData(); 

var query = contacts.Where(c => c.DateOfBirth.Year > 1970 || c.DateOfBirth.Year < 1960) 
        .GroupBy(c => c.FirstName); 
0
如果你使用數據表或數據集,然後它會像
dataTable.Select("Your simple where clause and other clauses")

,或者如果您使用
dataSet.Table[0].Select("Your simple where clause and other clauses")