我有一个我想搜索的字段组合列表。该列表实际上可以包含多达100个项目,我正在查询的表目前有超过100万条记录。
一个例子:
create table mytable
(
foo int not null
,bar int not null
,baz int not null
)
insert into
mytable
values
(1, 1, 11)
,(1, 2, 12)
,(1, 3, 13)
,(2, 1, 21)
,(2, 2, 22)
,(2, 3, 23)
,(3, 1, 31)
,(3, 2, 32)
,(3, 3, 33)
检索数据的一种可能方法:
select
foo
,bar
,baz
from
mytable
where
(foo = 1 and bar = 3)
or (foo = 2 and bar = 1)
or (foo = 3 and bar = 2)
另一种可能的方式:
declare @filtercombos table
(
foo int not null
,bar int not null
)
insert into
@filtercombos
values
(1, 3)
,(2, 1)
,(3, 2)
select
mytable.foo
,mytable.bar
,mytable.baz
from
@filtercombos fc
left join mytable on mytable.foo = fc.foo and mytable.bar = fc.bar
两者都将返回此数据:
foo bar baz
----------- ----------- -----------
1 3 13
2 1 21
3 2 32
现在,如果这是单个值的列表,我可以.Where(item => myList.Contains(item.foo))
。如何进行上述查询?我唯一能想到的是在DbContext上执行SQL,但如果可能的话我想避免这种情况。
答案 0 :(得分:3)
LINQKit的PredicateBuilder就是您所需要的!
var query = from u in context.Users select u;
var pred = Predicate.False<User>();
foreach(var filter in combofilers)
pred = pred.Or(u => u.Username == filter.Foo && u.Language == filter.Bar);
return query.Where(pred.Expand()).FirstOrDefault();
// or return query.AsExpandable().Where(pred).FirstOrDefault();
答案 1 :(得分:0)
如果您已经拥有其他列表中的组合列表,则可以执行以下操作。
var query = from m in Context.mytables
select m;
foreach (var foobar in foobars)
{
query = query.Where(x => x.foo == foobar.foo && x.bar == foobar.bar);
}
return query.ToList();
答案 2 :(得分:0)
或者类似于这个问题的答案可能有所帮助。