如何改变 linq to entity 语句的 WHERE 子句?
How to vary the WHERE clause of a linq to entity statement?
我正在使用 entity framework 6.1.2 和 Visual Studio 2012。现在我有这种效果的代码,其中 min
、max
和 item.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 的部件。
它可能会多次使用但在不同的列中使用,例如查找高度在一个范围内而宽度在另一个范围内的矩形。
我可能应该说得更清楚,但 item
和 value
只是占位符,可以代表任何东西。
我更喜欢使用 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 然后执行查询。
我正在使用 entity framework 6.1.2 和 Visual Studio 2012。现在我有这种效果的代码,其中 min
、max
和 item.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 的部件。
它可能会多次使用但在不同的列中使用,例如查找高度在一个范围内而宽度在另一个范围内的矩形。
我可能应该说得更清楚,但 item
和 value
只是占位符,可以代表任何东西。
我更喜欢使用 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 然后执行查询。