2010-08-24 17 views
5

Mam następujący 3 klas w moim pliku dbml:Filtr listę obiektów poprzez porównanie z innym liście różnych obiektów

public class Player { 
    public int PlayerID {get; set;} 
    public string Name {get; set;} 
} 

public class PlayerItem { 
    public int PlayerItemID {get; set;} 
    public int PlayerID {get; set;} 
    public int ItemID {get; set;} 
} 

istnieje związek między Player.ID stworzony i PlayerItem.PlayerID

Public Class CustomItem { 
    public int ItemID {get; set;} 
    public string ItemName {get; set;} 
} 

Oto konfiguracja:

  1. mam listę graczy - lista <Player>
  2. Każdy gracz ma EntitySet dziecko typu PlayerItem
  3. Mam listę elementów - List <Item>

Jak mogę wybrać tylko tych zawodników, które mają co najmniej jeden element niestandardowy w swojej liście PlayerItems? Jest to zasadniczo dopasowanie ItemID w PlayerItems każdego Gracza z identyfikatorem Item ID w CustomItem.

Ostatecznie, chciałbym mieć prostą listę graczy - Listę <Player> - do pracy.

Odpowiedz

6

LINQ zrobić tego rodzaju rzeczy łatwe:

players.Where(p => p.PlayerItemList.Any( 
       pi => customItems.Any(ci => ci.ItemID == pi.ItemID)); 

To również może być napisany w formie zapytania:

var result = from p in players 
      from pi in p.PlayerItemList 
      where customItems.Any(ci => ci.ItemID == pi.ItemID)); 

To będzie wykonywać najlepiej, jeśli utworzyć tabelę przeglądową lub słownika ze swojego zwyczaju zestaw elementów:

var customItemDict = customItems.ToDictionary(ci => ci.ItemID); 
var result = from p in players 
      from pi in p.PlayerItemList 
      where customItemDict.ContainsKey(pi.ItemID)); 
+0

Interesujące. Dam ci teraz szansę. –

+0

Upewnij się, że importujesz plik System.Linq do używanych przestrzeni nazw. – LBushkin

+0

Dzięki, ale nadal mam problemy. Moje pytanie nie było precyzyjnie sformułowane, ale od tego czasu je zaktualizowałem. NIE mam listy PlayerItem. Mam obiekt Player (wygenerowany w moim pliku dbml), który ma powiązanie z PlayerItem. Próbuję zapytać, ale nie mogę zapytać p.PlayerItems, ponieważ jest to Entityset i rzuca błędy w Visual Studiu. –

Powiązane problemy