可查询与多列表比较的位置
本文关键字:比较 位置 列表 查询 | 更新日期: 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个过滤器列表上使用OR
。Sql
有望能够在数据库级别过滤出大量的数据。
结果(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)