过滤LINQ的子集合另一个列表/阵列

问题描述:

当我试图筛选基于一个简单的值子集合我可以很容易地通过做这样做:过滤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。

有人冷,请帮我告诉我我做错了什么?我只想使用数组,列表,什么筛选集合...

问候, 鲁本斯

你几乎拥有了。您需要反转嵌套谓词中的逻辑来执行您正在搜索的集合,然后将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

你可以尝试如下图所示。

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))); –

试试这个:

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

尝试从子表开始:

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