2010-08-24 11 views
5

tengo los siguientes 3 clases en mi archivo dbml:Filtrar una lista de objetos mediante la comparación con otra lista de los diferentes objetos

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;} 
} 

Existe una asociación creada entre Player.ID y PlayerItem.PlayerID

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

Aquí está la configuración:

  1. tengo una lista de jugadores - lista <Player>
  2. Cada jugador tiene un niño EntitySet de tipo PlayerItem
  3. tengo una lista de artículos - Lista <Item>

¿Cómo puedo seleccionar sólo a aquellos jugadores que tienen al menos un elemento personalizado en su lista de PlayerItems? Básicamente se trata de un ItemID coincidente en los PlayerItems de cada jugador con el ID del artículo en CustomItem.

En definitiva, me gustaría tener una lista simple de jugadores - List <Player> - para trabajar con.

Respuesta

6

LINQ hacer este tipo de cosas fáciles:

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

Esto también se puede escribir en forma de solicitud:

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

Esto realizará mejor si se crea una tabla de consulta o diccionario de su encargo conjunto de objetos:

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

interesante. Voy a dar una oportunidad ahora. –

+0

Asegúrese de importar System.Linq en los espacios de nombres que está utilizando. – LBushkin

+0

Gracias, pero sigo teniendo problemas. Mi pregunta no estaba redactada con precisión, pero la he actualizado desde entonces. NO tengo una lista de PlayerItem. Tengo un objeto Player (generado en mi archivo dbml) que tiene una asociación con PlayerItem. Intento consultar pero no puedo consultar p.PlayerItems ya que es un Entityset y arrojo errores en Visual Studiu. –

Cuestiones relacionadas