2012-04-12 71 views
1

我得到了樹型對象。linq查詢語法,如何產生兩個列表組合的一個條件

一個對象EFacebook,很簡單,有一個屬性叫做id

class EFacebook 
{ 
    public string id { get; set; } 
} 

A EUser,更復雜。 EUser獲取內部列表EProvider,並且每個EProvider獲得一個類型。像:

class EUser 
{ 
    public string name { get; set; } 
    public List<EProvider> EProviders { get; set; } 
} 

class EProvider 
{ 
    public enum EnumType 
    { 
     facebook = 1, 
     twitter = 2 
    } 
    public string id { get; set; } 
    public EnumType type { get; set; } 
} 

而且兩個列表:(供應商,內部的用戶,列表是可選的,可爲空):

// list of facebooks 
List<EFacebook> facebooks = new List<EFacebook>(); 

facebooks.Add(new EFacebook { id = "1" }); 
facebooks.Add(new EFacebook { id = "2" }); 
facebooks.Add(new EFacebook { id = "3" }); 

// list of users 
List<EUser> users = new List<EUser>(); 
List<EProvider> ps1 = new List<EProvider>(); 

ps1.Add(new EProvider { id = "1", type = EProvider.EnumType.facebook }); 
ps1.Add(new EProvider { id = "2", type = EProvider.EnumType.twitter }); 

List<EProvider> ps2 = new List<EProvider>(); 
ps2.Add(new EProvider { id = "3", type = EProvider.EnumType.facebook }); 
ps2.Add(new EProvider { id = "4", type = EProvider.EnumType.twitter }); 

EUser u1 = new EUser { name = "somea", EProviders = ps1 }; 
EUser u2 = new EUser { name = "someb", EProviders = ps2 }; 
EUser u3 = new EUser { name = "somec" }; 

users.Add(u1); 
users.Add(u2); 
users.Add(u3); 

現在,我需要獲得基於關係的facebooks兩個孩子名單在facebook.iduser.eprovider(of enum facebook).id之間。這意味着,的EFacebook只包含對象facebookid 2的列表,因爲我沒有與facebook類型和id 2的提供者的用戶,並且包含所述對象facebookEFacebookid 1和3的列表,因爲我確實有facebook類型的providerid 1和id 3.

我嘗試了很多用戶,但它不工作:

/*var xaa = users.Select(z => z.EProviders.Where(x => x.ProviderType == 
    EProvider.EnumProviderType.Facebook).Select(x => x.Ip).Zip(z);*/ 

/*var a = users.Select(x => x.EProviders.Where(y => y.ProviderType == 
    EProvider.EnumProviderType.Facebook));*/ 


/* 
var outra = facebooks.Where(x=>     
var a = from i in users 
    where i.EProviders != null && i.EProviders.Any(j => j.ProviderType == 
    EProvider.EnumProviderType.Facebook) 
from j in i.EProviders 
join k in facebooks on j.Ip equals k.id 
select k; 

var b = facebooks.Except(a); 
*/ 

任何幫助將不勝感激。

+0

您還沒有涉及到EProvider對象EFacebook對象及其ID值和它們的ID值,但隨後從「現在怎麼解釋,我需要..「段落似乎我們要推斷他們是相關的?請進一步解釋或編輯問題的清晰度。 – 2012-04-12 16:09:17

+0

我覺得現在好多了。英語這不是我的第一語言,我很抱歉。 – lolol 2012-04-12 16:13:41

回答

2

如何:

// Create an enumerable of all IDs of Facebook providers from the users list 
var facebookIds = users 
    // Exclude all users with a null EProviders list 
    .Where(u => u.EProviders != null) 
    // For each user, select all EProviders with type == facebook 
    // and use SelectMany to flatten them into a single enumerable 
    .SelectMany(u => u.EProviders.Where(p => p.type == EProvider.EnumType.facebook)); 

// Use Join to find all facebooks whose IDs also exist in the facebookIds set constructed above 
var facebooksWithUsers = facebooks.Join(facebookIds, f => f.id, p => p.id, (f, p) => f); 

// Use Except to find the opposite subset 
var facebooksWithoutUsers = facebooks.Except(facebooksWithUsers); 

// Write the contents of the two sets to the console 
Console.WriteLine("facebooksWithUsers:"); 
foreach (var fb in facebooksWithUsers) 
{ 
    Console.WriteLine(fb.id); 
} 

Console.WriteLine(); 
Console.WriteLine("facebooksWithoutUsers:"); 
foreach (var fb in facebooksWithoutUsers) 
{ 
    Console.WriteLine(fb.id); 
} 

此輸出:

 
facebooksWithUsers: 
1 
3 

facebooksWithoutUsers: 
2 
+1

就我的問題而言,這正是您所要求的 - facebooksWithUsers包含ID爲1和3的臉書,facebooksWithoutUsers包含臉書ID爲2 – Iridium 2012-04-12 16:29:13

+0

我認爲這是行得通的。我不好,讓我再試一次。 (它是) – lolol 2012-04-12 16:32:22