2016-09-23 87 views
1

當我試圖篩選基於一個簡單的值子集合我可以很容易地通過做這樣做:過濾LINQ的子集合另一個列表/陣列

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

你幾乎擁有了。您需要反轉嵌套謂詞中的邏輯來執行您正在搜索的集合,然後將lambda延續變量暴露給該集合。我給一點點更復雜的例子是說你有其他的複雜對象的集合,你想找到那些性質和他們的父母,以及:

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

你真不知道我爲此搜了多少,真是的。非常感謝你幫助我,特別是爲了更好地理解righit邏輯。我必須反過來思考,這是幾乎不可能的。再次感謝您@djangojazz –

+0

沒問題,開心編碼。 – djangojazz

3

你可以嘗試如下圖所示。

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

updated.any對此的反饋? – Sampath

+1

非常感謝你幫助你。 (a => a.SubTable.Any(b => listOfIds.Contains(b.SubTableId)));我有一個變化,我不得不在我的具體情況 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);