2012-12-27 39 views
9

我見過很多了LINQ的例子包含對象的一個​​簡單的列表:LINQ凡與子句包含在列表中有複雜的對象

var intList= new List<int>() { 1, 2, 3 }; 
var result = db.TableRecords.Where(c => intList.Contains(c.RecordId)).ToList(); 

我試圖做似乎略多複雜(我認爲)。我有類似這樣的一行代碼,讓我的名單,我需要:

var xzList = db.Relations.Where(r => someOtherList.Contains(r.zId)) 
         .Select(r => new { AId = r.xId, BId = r.zId }) 
         .ToList(); 

現在我想類似前面例子中的結果,但名單現已在它與兩個整數匿名類型。那麼我現在怎麼得到result其中RecordIdTableRecords等於AId匿名類型xzList中的每個匿名類型?

+0

變種intList中= xzList.Select(的ListObject => listObject.AId).ToList(); – GunnerL3510

回答

11

聽起來像你不確定如何從你的匿名類型中獲取值。您可以使用GunnerL3510的解決方案,它轉儲到一個列表,或者你應該能夠內聯這樣的:

var result = 
    db.TableRecords 
     .Where(c => xzList.Select(n => n.AId) 
      .Contains(c.RecordId)) 
     .ToList(); 

因爲你在你的匿名類型命名的值,你指的他們就像性質。

如果您更喜歡採取更加結構化的方法,您可以使用this方法。

+0

我正要寫'c => xzList.Any(n => n.AId == c.RecordId)',但它或多或少都是一樣的。如果您想首先將所有'AId'轉儲到單獨的集合(這可能會更快,「GunnerL3510的解決方案」),請考慮使用'HashSet ',如:'new HashSet (xzList.Select(n => n。 AID))'。 –

+0

好吧,看起來我需要將列表中的內容與匿名對象一起轉換爲一個整數列表,然後在新列表中進行包含操作。我猜想我以爲會有另一種方式來參考名單 .Contains(),但它開始不以這種方式。 –

+0

@SailingJudo不,這不是唯一的可能性。如果您願意,您可以使用我的第一條評論的拉姆達箭頭。 –

0

像這樣:

db.TableRecords.Select(c=>c.RecordId).Intercept(xzList.Select(n => n.AId)).Any() 
相關問題