2016-04-25 26 views
0

Ich habe die folgende Abfrage:Vergleichen einer Liste innerhalb Linq Ausdruck

var zoneIds = filter.Zones.Select(s => s.ZoneId); 

var playerQuery = this._cmsDbContext.PlayersLoader.Query(user.ClientId); 

var sortedLocationIds = playerQuery 
    .Where(w => zoneIds.Contains(w.ZoneId)) 
    .GroupBy(g => g.LocationId) 
    .Select(s => s.Key); 

Das Problem ist, ich habe wie folgt: Wenn die Liste mit zoneIds mehr als 1 zoneId enthält, i die Positionen nur zurückkehren möchten Das hat alle Zonen-IDs in der Liste. Ab sofort gebe ich jeden Ort, an dem ich einen Treffer gefunden habe, in der zoneId-Liste zurück.

Also, wenn zoneIds enthält können sagen zoneId = 1 und zoneId = 5, ich will nur die Orte, die Spieler mit zoneId und hat. Jetzt bekomme ich jeden Ort, der entweder die Zone oder hat.

Jede Hilfe wäre sehr willkommen!

* edit,

hier sind die Klassen im, arbeiten mit:

public class Location : IEntityBase 
    { 
     public Location() 
     { 
      Players = new List<Player>(); 
      Filters = new List<Filter>(); 
     } 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int LocationId { get; set; } 

     public int? ProfileId { get; set; } 
     [ForeignKey("ProfileId")] 
     public virtual Profile Profile { get; set; } 

     public int StoreNumber { get; set; } 

     [StringLength(50)] 
     public string LocationName { get; set; } 

     [StringLength(50)] 
     public string Street { get; set; } 

     [StringLength(10)] 
     public string ZipCode { get; set; } 

     [StringLength(50)] 
     public string City { get; set; } 

     [StringLength(50)] 
     public string Country { get; set; } 

     [StringLength(20)] 
     public string Phone { get; set; } 

     [StringLength(50)] 
     public string Email { get; set; } 

     [StringLength(50)] 
     public string Homepage { get; set; } 

     public int LocationActive { get; set; } 

     public int? ClusterId { get; set; } 
     [ForeignKey("ClusterId")] 
     public virtual Cluster Cluster { get; set; } 

     public int? RegionId { get; set; } 
     [ForeignKey("RegionId")] 
     public virtual Region Region { get; set; } 

     public virtual ICollection<Player> Players { get; set; } 

     public virtual ICollection<Filter> Filters { get; set; } 

     public int ClientId { get; set; } 
     [ForeignKey("ClientId")] 
     public virtual Client Client { get; set; } 
    } 

    public class Player : IEntityBase 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int PlayerId { get; set; } 

     public int LocationId { get; set; } 
     [ForeignKey("LocationId")] 
     public virtual Location Location { get; set; } 

     public int ProfileId { get; set; } 
     [ForeignKey("ProfileId")] 
     public virtual Profile Profile { get; set; } 

     [StringLength(50)] 
     public string PlayerName { get; set; } 

     public int ZoneId { get; set; } 
     [ForeignKey("ZoneId")] 
     public virtual Zone Zone { get; set; } 

     public int NrOfScreens { get; set; } 

     public DateTime ModifiedDate { get; set; } 

     public DateTime CreatedDate { get; set; } 

     public int PlayerActive { get; set; } 

     public int ClientId { get; set; } 
     [ForeignKey("ClientId")] 
     public virtual Client Client { get; set; } 

     public DateTime LastContactDate { get; set; } 

     [Range(0, 3)] 
     public int ComputerStatus { get; set; } 

     [Range(0, 3)] 
     public int ScreenStatus { get; set; } 

     [Range(0, 3)] 
     public int ExtStatus { get; set; } 

     public DateTime LastServiceDate { get; set; } 
    } 
+0

Können Sie bitte die entsprechenden Entitätsklassen mit den entsprechenden Eigenschaften zur Verfügung stellen? –

+0

Wie bekommen wir alle Zonen eines Spielers? Ihr Beispiel zeigt nur eine einzige Eigenschaft 'ZoneId' an. – Toxantron

+0

Ein Spieler hat nur eine Zone, ein Ort hat mehrere Spieler. – grimsan55

Antwort

0

Sie !zoneIds.Except(locationGroupZoneIDs).Any verwenden können:

var sortedLocationIds = playerQuery 
    .GroupBy(w => w.LocationId) 
    .Where(g => !zoneIds.Except(g.Select(w => w.ZoneId)).Any()) 
    .Select(g => g.Key); 

Ein weiterer Ansatz, wahrscheinlich besser lesbar, aber ein bisschen weniger effizient :

var sortedLocationIds = playerQuery 
    .GroupBy(w => w.LocationId) 
    .Where(g => zoneIds.All(id => g.Select(w => w.ZoneId).Contains(id))) 
    .Select(g => g.Key); 
+0

Ich mochte den ersten Ansatz viel besser. Vielen Dank Tim, es funktioniert perfekt! – grimsan55

0

Was Sie brauchen, ist

var zoneIds = filter.Zones.Select(s => s.ZoneId); 

var playerQuery = this._cmsDbContext.PlayersLoader.Query(user.ClientId); 

var sortedLocationIds = playerQuery 
    .SelectMany(w => w.Players.Where(p=>p.ZoneId == w.ZoneId)) 
    .Select(s=>s.LocationId) 
    .Distinct(); 
Verwandte Themen