【问题标题】:How to vary the WHERE clause of a linq to entity statement?如何改变 linq to entity 语句的 WHERE 子句?
【发布时间】:2015-03-06 22:08:54
【问题描述】:

我在 Visual Studio 2012 中使用实体框架 6.1.2。现在我有实现这种效果的代码,其中 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

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

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

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

这样in_range 可以扩展为任何必要的内容。

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

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

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

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

我可能应该更清楚一点,但 itemvalue 只是可能是任何东西的占位符。

【问题讨论】:

    标签: vb.net linq entity-framework where


    【解决方案1】:

    编辑 我误解了处理 +/- 无穷大的原始问题。您可以测试最小值/最大值,而不是编写三个查询,如果其中一个返回无穷大,则将它们设置为等于Double.MaxValueDouble.MinValue,然后执行查询。

    【讨论】:

    • 同样的东西写三遍的原因是实体框架不能处理无限双打。我目前使用三个单独的案例来处理每种可能的无穷大组合,但这很乏味。
    • @Whanhee 对不起,我误解了你的意思。我用一些指向 MSDN 文档的链接编辑了我的答案。这仍然有些费力,但您可以使用 if 语句来测试无限,并在使用查询中的变量之前将违规者设置为 double.MaxValue 或 double.Minvalue
    • 当我处理表达式树时,显而易见的解决方案让我无法理解。感谢您的帮助。
    • @Whanhee 没问题,我很高兴这对你有用 :)
    【解决方案2】:

    我更喜欢使用 C# 语法,但您可以使用扩展方法表达 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 应该很简单。

    【讨论】:

    • 我认为这不会很有效。一些查询会在不同命名的列或子查询返回的值上使用in_range。我想以某种方式概括这一点。
    • 我已经编辑了我的问题以提供一些更相关的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多