加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:53:25 所属栏目:百科 来源:网络整理
导读:我在编写C# linq查询时遇到问题,该查询基于过滤器列表的多个列从数据库中检索数据. 项目列表包含多个列(例如A和B)并且是动态的. 我的第一个想法是在where语句中编写任何语句,但在EF中不允许这样做. var result = _repository.Where(x = items.Any(y = x.A ==
我在编写C# linq查询时遇到问题,该查询基于过滤器列表的多个列从数据库中检索数据.

项目列表包含多个列(例如A和B)并且是动态的.
我的第一个想法是在where语句中编写任何语句,但在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)

但是没有合适的方法可以做到这一点.

有谁知道如何解决这个问题?

解决方法

所以,不完全在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的SQL

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

这就是你所追求的,显然初始循环可能会很慢,具体取决于你有多少项,但如果SQL表被正确索引,它应该仍然是一个快速查询

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读