gpt4 book ai didi

c# - 使用 linq-to-sql 帮助进行高级数据库搜索

转载 作者:行者123 更新时间:2023-11-30 20:11:05 24 4
gpt4 key购买 nike

我有一个包含“命令”和“状态”的数据库表。每个命令可以有多个状态,用户可以在搜索时配置。例如,命令可以是“运行”,它可以有两种状态:“快”和“慢”。

我想在我的表中搜索所有名为“运行”且“快”或“慢”的命令。这很简单:

var results = from t in table
where t.Command == "Run" &&
(t.State == "Fast" || t.State == "Slow")
return t;

但是用户也可以搜索状态为“Fast”的命令“Walk”,因此查询如下所示:

    var results = from t in table
where (t.Command == "Run" &&
(t.State == "Fast" || t.State == "Slow")) ||
(t.Command == "Walk" &&
t.State == "Fast")
return t;

像这样的搜索可能有很多,我想知道如何将它们组合成某种循环。

我不能这样做:

foreach(var command in commands)
{
foreach(var state in command.states)
{
results = from t in table
where t.Command == command.Command &&
t.State == state;
}
}

因为一旦它搜索“运行”,“步行”就会被排除在结果之外,所以搜索“步行”将导致根本没有结果。

有人知道这样做的好方法吗?

最佳答案

使用 Joe Albahari 的 PredicateBuilder构建谓词:

var predicate = PredicateBuilder.False<Entry>();
foreach(var command in commands)
{
foreach(var state in command.states)
{
predicate = predicate.Or(p => p.Command == command.Command && p.State == state);
}
}
var query = table.Where(predicate);

或更多 LINQ-heavy 版本:

var commandStates = from c in commands
from s in c.states
select new {c.Command, State = s};
var predicate = commandStates.Aggregate(
PredicateBuilder.False<Entry>(),
(pred, e) => pred.Or(p => p.Command == e.Command && p.State == e.state));
var query = table.Where(predicate);

关于c# - 使用 linq-to-sql 帮助进行高级数据库搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216968/

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