你是怎么做到的?
我坐在这里,试图让自己和他人更简单。但我似乎无法决定哪种方式最好。问题是:
从数据上下文中收集一些东西,然后开始过滤掉一大堆不同的标准。如果是这样,那么那些或者那些除非那不是这个,而是那些以及那些和山上之间除非没有任何东西然后向后,向上和向外。
好吧,也许不是那么复杂......但我基本上需要建立这样的树:
start
|
x
|
x
/ \
x x
| |
x x
\ /
x
/ \
x x
| |
x |
| |
x x
\ /
x
|
result
其中|
代表And
,分支代表Or
。由于Or
替代路径,我无法一直使用data.Where(...).Where(...).Where(...)
。使用Union
和Concat
之类的内容有tendency to crash(实际上尚未设法以有效的方式使用它)。换句话说,我必须建立Expression<Func<T, bool>>
个实例。
我已经创建了扩展方法,可以将这些方法与AndAlso
和OrElse
(lots of help中的Marc一起添加。我已经开始创建一个谓词构建器类来制作东西甚至更简单一点。计划是创建And
- 东西的链,然后Or
他们在一起......有点......:p
无论如何,我无法决定这些是不是好主意。我想我现在开始走的路,在编码这些链条时,可能最终会为我提供一个好的“工作环境”。但我很想知道其他人是如何解决这些问题的。我认为这可能很常见,至少在那些必须以各种奇怪的方式过滤和处理数据然后将其显示给用户的应用程序中。
答案 0 :(得分:2)
有些人发誓Predicate Builder。就个人而言,我总是发现手动修剪Expression
就足够了 - 但也许我只是那么奇怪(而且,我一直在玩Expression
API很长一段时间)。但只要你有适当的单元测试,我就看不出这种方法的任何问题。目前最大的抱怨是EF对Expression.Invoke
的有限支持 - 请放心,这将是我在4.0版“beta”时检查的第一件事。
答案 1 :(得分:1)
看起来不是特别干净,如果这是一个非常复杂的情况,可能会变得更加丑陋,但对于简单的东西,我有时会建立这样的查询
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;
这当然只有在预定义查询可能性时才有效。我不知道你的例子中是否就是这种情况。