如何改变 linq to entity 语句的 WHERE 子句?

How to vary the WHERE clause of a linq to entity statement?

我正在使用 entity framework 6.1.2 和 Visual Studio 2012。现在我有这种效果的代码,其中 minmaxitem.value 是双打:

If Not Double.IsNegativeInfinity(min) AndAlso Not Double.IsPositiveInfinity(max) Then
    query = From item In query
        Where item.value >= min AndAlso item.value <= max
        select item
ElseIf Not Double.IsNegativeInfinity(min) Then
    query = From item In query
        Where item.value >= min
        select item
ElseIf Not Double.IsPositiveInfinity(max) Then
    query = From item In query
        Where item.value <= max
        select item
End If

提供的示例很简单,但有几个具有复杂查询的实例,我必须有效地写三遍,因为 entity framework 不知道如何处理无限双精度数。

我想做的是将所有内容替换为:

query = From item In query
    Where in_range(item.value, min, max)
    select item

这样 in_range 可以扩展到任何必要的地方。

这可能吗?如果可以,我该怎么做?

编辑: 我的一些查询更复杂,涉及对某些子查询的结果或不同命名的列使用 in_range

例如,它可能用于查找所有部件总重量小于 20 的部件。

它可能会多次使用但在不同的列中使用,例如查找高度在一个范围内而宽度在另一个范围内的矩形。

我可能应该说得更清楚,但 itemvalue 只是占位符,可以代表任何东西。

我更喜欢使用 C# synax,但您可以使用扩展方法表达 Linq 查询并以这种方式操作它们:

void InRange<T>(IQuerable<T> query, Double value, Double min, Double max) {
    if( Double.IsNegativeInfinity(value) ) return query.Where( i => i.value >= min);
    if( Double.IsPositiveInfinity(value) ) return query.Where( i => i.value <= max );
    return query.Where( i => i.value >= min && i.value <= max );
}

然后像这样使用:

query = InRange( query, item.value, min, max ).Select( i => i.whatever );

将其转换为 VB 应该很简单。

编辑 我误解了处理 +/- 无穷大的原始问题。您可以测试 min/max 而不是编写三个查询,如果 returns 无穷大则将它们设置为等于 Double.MaxValue or Double.MinValue 然后执行查询。