通过另一个列表/数组过滤Linq子集合

3

当我尝试根据一个简单的值对子集合进行过滤时,可以轻松完成此操作,只需执行以下操作:

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。我得到的错误是Cannot convert from System.Collections.Generic to Func。

有人可以帮帮我告诉我我做错了什么吗?我只想使用数组、列表或其他任何东西来过滤集合...

祝好, Rubens

4个回答

5
您可以按照以下步骤尝试:
db.Table.Where(a => a.SubTable.Any(x=> listOfIDs.Contains(x.SubTableId)));

1
非常感谢您的帮助,@Sampath。 在我的特定情况下,我需要做一些小改变: db.Table.Where(a => a.SubTable.Any(b => listOfIds.Contains(b.SubTableId))); - Rubens Mussi Cury

2

你差不多快成功了。你需要在嵌套谓词中反转逻辑,以便进行你正在搜索的集合,并将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();
}

你不知道我为此搜索了多久,真的非常感谢你帮助我,并特别感谢你让我更好地理解正确的逻辑。我不得不反向思考,这对于刚开始的人来说几乎是不可能的。再次感谢 @djangojazz。 - Rubens Mussi Cury
没问题,愉快编程。 - djangojazz

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

尝试从SubTable开始:

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

最后,如果您无法访问SubTable表

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接