【问题标题】:C#, Linq2SQL: Building up expressionsC#、Linq2SQL:构建表达式
【发布时间】:2009-03-26 14:31:49
【问题描述】:

你是怎么做到的?

我坐在这里,努力让自己和他人的事情变得更简单。但我似乎无法决定哪种方式是最好的。问题是这样的:

从数据上下文中的一些东西的集合开始,然后开始过滤掉一大堆不同的标准。如果是这样,那么那些或者也许是那些,除非那不是这个而是那个,在那些之间和山上,除非什么都没有,然后向后,向上和超越。

好吧,也许没那么复杂……但我基本上需要建立这样的树:

        start
          |
          x
          |
          x
         / \
        x   x
        |   |
        x   x
         \ /
          x
         / \
        x   x
        |   |
        x   |
        |   |
        x   x
         \ /
          x
          |
        result

其中| 代表And,分支代表Or。由于Or 替代路径,我不能一直使用data.Where(...).Where(...).Where(...)。并且使用UnionConcat 之类的东西有一个tendency to crash(实际上还没有设法以一种有效的方式使用它)。换句话说,我必须建立Expression<Func<T, bool>> 实例。

我已经创建了扩展方法,将它们与AndAlsoOrElse 相加(使用lots of help 来自Marc。我已经开始创建一个谓词构建器类以使事情变得更简单一些。计划是创建And-stuff 的链,然后将Or 它们放在一起......有点......:p

无论如何,我只是无法确定这些想法是否好。我认为我现在开始的道路可能会在我编写这些链时为我提供一个不错的“工作环境”。但我很想知道其他人是如何解决这些问题的。我认为这可能很常见,至少在必须以各种奇怪的方式过滤和处理数据然后将它们显示给用户的应用程序中。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    有些人以Predicate Builder 发誓。就我个人而言,我一直觉得手动修改Expressions 就足够了——但也许我就是这么奇怪(此外,我已经使用Expression API 有一段时间了)。但只要你有合适的单元测试,我看不出这种方法有什么问题。当前最大的抱怨将是 EF 对Expression.Invoke 的有限支持 - 请放心,当 4.0 进入“测试版”时,这将是我检查的第一件事。

    【讨论】:

    • 是的,我的 PredicateBuilder 有点基于 albahari nutshell builder 的东西。我在您的博客中阅读了有关 EF Invoke 的内容...但希望这将得到解决...不过现在对我来说不是问题,因为我们使用的是 Linq2Sql。
    • 通过“手动修改表达式”,你的意思是做所有这些 ParameterExpression 之类的事情吗? BinaryExpression = AndAlso(Invoke, Invoke);拉姆达(...);链中每个项目的东西?还是你使用扩展方法?
    • 我倾向于保持严格的范围并使用 Expression.Invoke,所以我一次只做一件合乎逻辑的事情......你当然可以构建一个高度复杂的链,但我发现更难调试。
    【解决方案2】:

    看起来不是特别干净,如果它是一个非常复杂的情况可能会变得更丑陋,但是对于简单的东西我有时会构建这样的查询

    string MinOrMaxOption = "min";
    int CompareValue = 5;
    var Results = from row in MyData
                  where (MinOrMaxOption=="min" && row.ValueA > CompareValue)
                  || (MinOrMaxOption=="max" && row.ValueA < CompareValue)
                  select row;
    

    这当然只有在查询可能性被预定义的情况下才有效。我不知道你的例子是不是这样。

    【讨论】:

    • 是的,这最终可能会变得非常丑陋是的......但对于简单的事情,那么是的,可能 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多