在C#中的给定变量之间查找表中的最小值和最大值

时间:2012-08-09 11:14:25

标签: c# linq entity-framework

我有以下数据库表:

COL-A COL-B
1     $200
2     $100
4     $50
5     $40 

我需要做的是,如果我的值 1.5 ,我需要找到介于它之间的两个数字,因此 1 2

我需要将值输入到我正在处理的定价计算器的线性方程式中。

值可能并不总是相同,所以它甚至可能是这样:

COL-A COL-B
    1     $200
    6     $100
    11     $50
    22     $40 

如果我 9 ,我会返回 6 11 ,因为 9 介于这些之间两个值等等

可视化我需要将它们放入单独的变量中:

double Min = the_lowest_value;
double Max = the_highest_value;

我使用EF来执行此操作,因此需要使用LINQ。

2 个答案:

答案 0 :(得分:6)

需要2个DB请求的简单解决方案:

double the_lowest_value = Ctx.YourEntities
        .Where(z => z.ColA <= 9)
        .OrderByDesc(z => z.ColA)
        .Select(z => z.ColA)
        .First();

double the_highest_value = Ctx.YourEntities
        .Where(z => z.ColA >= 9)
        .OrderBy(z => z.ColA)
        .Select(z => z.ColA)
        .First();

请注意,如果您的值(上例中的9)在您的表中,则两个变量都具有相同的值(9)。


编辑:正如Slauma注意到的,如果指定的值低于/大于InvalidOperationException的任何值,则会崩溃(即抛出ColA异常),因为First()至少需要返回序列中的一个元素。如果序列为空,您可以使用FirstOrDefault()返回默认的double值:

对于正值:

由于default(double)0.0the_lowest_value的值为OK(如果第二个示例中指定的输入值为0.5)。 对于the_highest_value,您可以在数据库查询之后测试它实际上是否大于或等于指定的输入值。如果不是这样,您就会知道您指定的值大于ColA列的每个值。

答案 1 :(得分:1)

这将在一个查询中解决它,但同样,OP必须确保给定值介于两个现有值之间。

using (var context = new YourContext()) {
    var val = 15;
    var query2 = context.Table
        .GroupBy(
            x => new {
                IsGreaterThan = x.Column > val,
                IsLessThan = x.Column < val
            },
            (key, data) => new { key = key, data = data.Select(x => x.Column) }
        )
        .Select(x => x.key.IsGreaterThan ? x.data.Min() : x.data.Max())
        .ToList();
    Console.WriteLine("First value larger than {0} = {1}", val, query2[0]);
    Console.WriteLine("First value smaller than {0} = {1}", val, query2[1]);
    Console.ReadLine();
    return;
}