gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:38:23 25 4
gpt4 key购买 nike

我在编写 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)

但是没有合适的方法来做到这一点。

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

最佳答案

所以,不完全是在 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 表被正确索引,它仍然应该是一个快速查询

关于c# - 从数据库中检索与列表的多个值匹配的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53104814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com