2

我有一个要搜索的字段组合列表。该列表实际上可以包含多达 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,但如果可能的话,我想避免这种情况。

4

3 回答 3

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

Linq to Entities 中的动态 where 子句 (OR)

于 2013-06-11T15:16:27.673 回答
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();
于 2013-06-11T14:45:38.697 回答
0

或者,类似于这个问题的答案可能会有所帮助。

实体框架 - 加入列表

于 2013-06-11T14:47:51.817 回答