2016-09-23 22 views
1

Wenn ich versuche, ein Kind Sammlung zu filtern, auf einem einfachen Wert basiert ich kann es leicht durch so etwas wie dies zu tun:Filter Linq Child Sammlung durch eine andere Liste/Array

db.Table.Where(a => a.SubTable.Any(b => b.SubTableId == 1)); 

Aber wenn ich versuche, dies zu filtern gleiche Kindersammlung nach einer Liste von Werten, die davon entspricht, bekomme ich die ganze Zeit Fehler.

List<long> listOfIDs = new List<long> { 1, 2, 3 }; 
db.Table.Where(a => listOfIDs.Any(a.SubTable.Select(b => b.SubTableId)); 

Ich suchte viel, wie man das macht, und ich fange immer noch EF an. Der Fehler, den ich erhalte, kann von System.Collections.Generic zu Func nicht konvertiert werden.

Jeder kalt bitte helfen Sie mir sagen, was ich falsch mache? Ich möchte nur eine Sammlung mit einem Array, Liste, alles filtern ...

Grüße, Rubens

Antwort

1

Sie fast hatte. Sie müssen die Logik im verschachtelten Prädikat umkehren, um die gesuchte Kollektion zu erstellen, und dann die Lambda-Fortsetzungsvariable dem gegenüberstellen. Ich habe ein wenig komplexeres Beispiel waren sagen Sie eine Sammlung von anderen komplexen Objekten haben, und Sie wollen auch Eigenschaften von denen, und ihre Eltern zu finden:

public class POC 
{ 
    public int Id { get; set; } 
    public string Desc { get; set; } 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public string Desc { get; set; } 
} 

static List<Order> GetOrders(int numberOfOrders) 
{ 
    var orders = new List<Order>(); 

    for (int i = 1; i <= numberOfOrders; i++) 
    { 
    orders.Add(new Order { Id = i, Desc = $"{i} Order" }); 
    } 

    return orders; 
} 

static List<POC> GetPOCOsAndOrders() 
{ 
    return new List<POC> 
    { 
     new POC { Id = 1, Desc = "John", Orders = GetOrders(1)}, 
     new POC { Id = 2, Desc = "Jane", Orders = GetOrders(2) }, 
     new POC { Id = 3, Desc = "Joey" , Orders = GetOrders(3)} 
    }; 
} 


static void Main(string[] args) 
{ 
    var orders = new List<int> { 2, 3 }; 
    var items = GetPOCOsAndOrders(); 

    var peopleAndOrdersWhereOrderNumberIsGreaterThanTwo = items.Where(x => x.Orders.Any(y => orders.Contains(y.Id))); 

    //I should only get the last two people out of three and their orders 
    peopleAndOrdersWhereOrderNumberIsGreaterThanTwo.ToList().ForEach(x => Console.WriteLine($"{x.Id} {x.Desc} {x.Orders.Count}")); 

    Console.ReadLine(); 
} 
+0

Sie haben keine Ahnung, wie sehr ich danach gesucht habe, ernsthaft. Vielen Dank, dass Sie mir dabei helfen und vor allem, um die Rechtslogik besser zu verstehen. Ich musste rückwärts denken und es war fast unmöglich für diesen Start. Vielen Dank nochmal @djangojazz –

+0

Kein Problem, fröhliche Codierung. – djangojazz

3

Sie können versuchen, wie unten gezeigt.

db.Table.Where(a => a.SubTable.Any(x=> listOfIDs.Contains(x.SubTableId))); 
+0

aktualisiert.Alles Feedback dazu? – Sampath

+1

Vielen Dank @Sampath für Ihre Hilfe. Ein bisschen ändern musste ich in meinem speziellen Fall db.Table.Where (a => a.SubTable.Any (b => listOfIds.Contains (B.SubTableId))); –

0

versuchen Sie dies:

var ResultList=(
     from elemID in listOfIDs 
     from elemA in db.Table.Where(elemA => elemA.SubTable.Contains(elemID)).DefaultIfEmpty() 
    where elemA !=null 
    select elemA).ToList(); 
0

Versuchen Sie, aus der untergeordneten Tabelle Start:

var results = from s in SubTable 
       join id in listOfIDs on s.SubTableID equals id.ID 
       select s.Table; 

oder wenn Sie es vorziehen

var results = subTables.Where(a => listOfIDs.Contains(a.SubTableID)) 
         .Select(s => s.Table); 

Schließlich, wenn Sie den Zugriff auf die untergeordnete Tabelle Tabelle nicht

haben
var results = tables.Select(t => t.SubTable) 
        .Where(a => listOfIDs.Contains(a.SubTableID)) 
        .Select(s => s.Table); 
Verwandte Themen