1

我有以下数据库表:

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

我需要做的是,如果我有值1.5,我需要找到介于它之间的两个数字,所以这将是12

我需要将这些值输入到我正在研究的定价计算器的线性方程中。

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

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

如果我有9,我会同时返回611因为9介于这两个值之间,等等

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

double Min = the_lowest_value;
double Max = the_highest_value;

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

4

2 回答 2

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.0,该值可以the_lowest_value(如果指定的输入值0.5与您的第二个示例相同)。对于the_highest_value,您可以在 DB 查询之后测试它实际上是否大于或等于指定的输入值。如果不是这种情况,您将知道您指定的值大于ColA列的每个值。

于 2012-08-09T11:23:44.323 回答
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;
}
于 2012-08-09T11:43:06.830 回答