【问题标题】:Advanced database search using linq-to-sql help使用 linq-to-sql 帮助的高级数据库搜索
【发布时间】:2011-05-12 03:29:05
【问题描述】:

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

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

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;
    }
}

因为一旦搜索“Run”,“Walk”就会被排除在结果之外,因此询问“Walk”将根本没有结果。

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

【问题讨论】:

    标签: c# asp.net-mvc linq-to-sql for-loop


    【解决方案1】:

    使用 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 的版本:

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

    【讨论】:

    • 这实际上非常及时(谓词构建器),因为我最近在聚合 where 子句时步履蹒跚 - 很好的发现。你的成功是如何体现的??
    • @jim:实际上我还没有需要它。我们所做的大部分工作要么简单到不需要它,要么足够先进,无论如何我都必须手动构建整个表达式树。如果您正在使用 PredicateBuilder,您可能希望一般地查看 LinqKit。它有一些方便的功能来调用谓词和事物。
    • 是的,最近手工滚动的表达式树花费的时间比我愿意承认的要多。我会看看整个套件的想法,...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多