可查询与多列表比较的位置

本文关键字:比较 位置 列表 查询 | 更新日期: 2023-09-27 18:06:47

我有一个基本的iquerable,

private static IQueryable<TestObject> GetFilteredQuery(Guid componentId, Guid productId)
    {
      IQueryable<TestObject> query = from t in ModelQuery.Query<TestObject>()
                                     where t.ComponentId == componentId && t.ProductId == productId
                                     select t;
      return query;
    }

如果我必须比较单个componentId和产品tid,这是微不足道的。

我的问题是我如何处理当我有一个值对列表,

Guid[] componentIds, Guid[] productIds

where,它是一种keyValue对

,

 private static IQueryable<TestObject> GetFilteredQuery(Guid[] componentIds, Guid[] productIds)
    {
      IQueryable<TestObject> query = from t in ModelQuery.Query<TestObject>()
                                     where (t.ComponentId must be present in componentIds[] && t.ProductId must be present in productIds)
                                     select t;
      return query;
    }

可查询与多列表比较的位置

使用Contains:

 private static IQueryable<TestObject> GetFilteredQuery(Guid[] componentIds, Guid[] productIds)
    {
      IQueryable<TestObject> query = 
         from t in ModelQuery.Query<TestObject>()
         where (componentIds.Contains(t.ComponentId) 
                && productIds.Contains(t.ProductId))
         select t;
      return query;
    }

编辑

我知道Linq2Sql没有办法将Guid元组序列映射到本地Sql(您可能需要一个@Table参数)

所以这里有一种方法,即运行与上面相同的包含的查询,但在2个过滤器列表上使用ORSql有望能够在数据库级别过滤出大量的数据。

结果(candidates)然后需要具体化,然后根据组件和产品对在内存中过滤。我通过将两个guid数组压缩在一起(假设长度相似-可能您想将数组重新建模为pair数组以更明确地表达意图?)

private static IQueryable<TestObject> GetFilteredQuery(Guid[] componentIds, 
                                                       Guid[] productIds)
{
    var candidates = ModelQuery
         .Query<TestObject>()
         .Where(componentIds.Contains(
                         t.ComponentId) || productIds.Contains(t.ProductId))
         .ToList();// Need to materialize
    var guidPairs = componentIds.Zip(productIds, 
          (c, p) => new {ComponentId = c, ProductId = p});
    return candidates
      .Join(guidPairs, 
            c => new {ComponentId = c.ComponentId, ProductId = c.ProductId}, 
            gp => gp, 
            (c, gp) => c)
      .AsQueryable();
}

注意,生成的可查询对象实际上不适合进一步的组合,因为它已经被物化了。此外,如果您可以在点击此选项之前进行额外的过滤,这将是有益的。恐怕我还没有测试过这个

使用Contains:

where componentIds.Contains(t.ComponentId) && productIds.Contains(t.ProductId)