2016-09-23 4 views
1

При попытке отфильтровать коллекцию ребенка, основанный на простом значении я могу сделать это легко сделать что-то вроде этого:Filter Linq Child Collection другой список/массив

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

Но когда я пытаюсь фильтровать этот той же дочерней коллекции в соответствии со списком значений, которые соответствуют ей, я получаю ошибки все время.

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

Я много искал, как это сделать, и я все еще начинаю EF. Ошибка, которую я получаю, не может конвертироваться из System.Collections.Generic в Func.

Любой холодный, пожалуйста, помогите мне рассказать мне, что я делаю неправильно? Я просто хочу, чтобы отфильтровать коллекцию, используя массив, список, ничего ...

С уважением, Рубенса

ответ

1

Вы почти имели его. Вам нужно отменить логику во вложенном предикате, чтобы сделать коллекцию, которую вы ищете, а затем выставить для нее переменную продолжения лямбда. Я дал немного более сложный пример, были у вас есть коллекция других сложных объектов, и вы хотите, чтобы найти свойства тех и их родителей, а также:

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

Вы не представляете, сколько я искал, Серьезно. Большое вам спасибо, чтобы помочь мне в этом и специально, чтобы лучше понять логику ригита. Мне приходилось думать обратное, и это было почти невозможно для этого начала. Еще раз спасибо @djangojazz –

+0

Без проблем, счастливое кодирование. – djangojazz

3

Вы можете попробовать, как показано ниже.

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

updated.any отзыв для этого? – Sampath

+1

Большое спасибо @Sampath за помощь. Немного поменять мне пришлось в моем конкретном случае db.Table.Where (a => a.SubTable.Any (b => listOfIds.Contains (b.SubTableId))); –

0

попробовать это:

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

Попробуйте начать с Подтаблица:

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

или, если вы предпочитаете

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

Наконец, если у вас нет доступа к подтаблица таблице

var results = tables.Select(t => t.SubTable) 
        .Where(a => listOfIDs.Contains(a.SubTableID)) 
        .Select(s => s.Table); 
Смежные вопросы