2011-10-19 34 views
2

考慮以下代碼:如何將此LINQ查詢寫入單個查詢?

var query = from groupRole in CurrentItem.MEMGroupRoles 
      select groupRole.MEMRole; 
this.AvailableRoles = this.allRoles.Except(query.AsEnumerable()).ToList(); 

在這段代碼中我把allRoles除了CURRENTITEM已經有這些角色。 2個問題:

  1. 它不工作,因爲我比較對象和這些對象的不同實例
  2. 我不喜歡2號線,喜歡提高。

這裏是我真正需要的,現在做的僞代碼:

var queryIds = from groupRole in CurrentItem.MEMGroupRoles 
       select groupRole.MEMRole.RoleId; 
this.AvailableRoles = this.allRoles.Except(where RoleId query.AsEnumerable()).ToList(); 

我如何寫這樣的查詢?

編輯

解釋:

  1. allRoles包含MEMRole的對象列表
  2. CurrentItem.MEMGroupRoles包含MEMGroupRole對象的列表以及每個MEMGroupRole裏面包含

我MEMRole想要選擇除了這些MEMRole以外的所有角色內的所有MEMRole對象s嵌入CurrentItem中。第一個代碼片段可以工作,但是我需要通過MEMRole.RoleId將MEMRole與MEMRole進行比較,因爲它是同一個數據庫實體的不同實例。

+2

你能用英文寫出你想完成的任務嗎?從你的代碼中我不清楚。你應該專注於工作代碼。在正常代碼中,你不應該爭取最少的行數。 – svick

+0

@svick看到編輯後 – katit

回答

0

跟着你建議的方法:

var ids = CurrentItem.MEMGroupRoles.Select(g => g.MMERole.RoleId); 
this.AvailableRoles = this.allRoles.Where(r => ids.All(i => i != r.RoleId)); 

或者操作(雖然我不會走這條道路),如果你必須有單號查詢,您可以將兩個角色集合(電流所有),組他們通過RoleId並挑選僅具有單個成員組:

this.AvailableRoles = CurrentItem.MEMGroupRoles 
    .Select(g => g.MEMRole) 
    .Concat(this.allRoles) 
    .GroupBy(r => r.RoleId) 
    .Where(g => g.Count() == 1) 
    .Select(g => g.First()); 

這會導致不在CurrentItem.MEMGroupRoles集合中的角色。但再一次,這只是...爲運動:)

1

如果角色對象的角色對象與角色ID一致,則可以覆蓋Equals()GetHashCode()。如果不是這種情況,您可以創建一個角色比較器類來實現IEqualityComparer<>Except()將等號比較器作爲第二個參數。

這是一個解決方案,它創建角色ID的查找並使用它來過濾角色。但是,我確實認爲上述替代方案對於您的問題是更好的解決方案。

var lookup = CurrentItem.MEMGroupRoles 
     .ToLookup(groupRole => groupRole.MEMRole.RoleId); 
this.AvailableRoles = this.allRoles 
     .Where(role => !lookup.Contains(role.RoleId)) 
     .ToList(); 
0

這是LINQ to SQL?

如果是這樣,請使用DataContext.Log屬性查看傳遞給數據庫的實際SQL,這可能有助於您診斷問題。