从数据库中检索与列表的多个值匹配的记录

时间:2018-11-01 15:54:11

标签: c# entity-framework linq

基于过滤器列表的多列,编写C#linq查询以从数据库中检索数据时遇到问题。

项目列表包含多个列(例如A和B),并且是动态的。 我的第一个想法是在where语句中编写any语句,但这在EF中是不允许的。

var result = _repository.Where(x => items.Any(y => x.A == y.A && x.B == y.B));

我还首先仅在A上尝试了过滤器,然后检索了所有数据并在B上进行了过滤,但是效果不佳。

var ListA = items.Select(x => x.A).ToList();
var result = _repository.Get(x => ListA.Contains(x.A));

另一种方法是创建一些c#代码以生成如下内容:

SELECT A,B,C,D
FROM Items 
WHERE 
    (A = 1 AND b = 1) OR 
    (A = 7 AND b = 2) OR 
    (A = 4 AND b = 3)

但是没有做到这一点的好方法。

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

因此,不完全在Linq中,但是一种实现方法是使用Predicate / PredicateBuilder(here上的信息)

这将允许您设置类似的内容

var predicate = PredicateBuilder.False<YourType>();
foreach (var item in items)
{
    var innerpred = PredicateBuilder.True<YourType>();
    innerpred = innerpred.And(x=> x.A == item.A);
    innerpred = innerpred.And(x=> x.B == item.B);
    predicate = predicate.Or(innerpred);
}

那么您的条件将是

var result = _repository.Where(predicate);

您可以轻松地将谓词生成移动到静态方法或类似的方法中以清理代码,但这将导致where子句生成

的SQL
WHERE 
(A = 1 AND b = 1) OR 
(A = 7 AND b = 2) OR 
(A = 4 AND b = 3)

这是您要执行的操作,显然,初始循环可能很慢,具体取决于您拥有多少项,尽管如果正确索引了SQL表,它仍然应该是一种快速查询