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

xqw*_*zid 1 c# linq entity-framework

我有以下数据库表:

COL-A COL-B
1     $200
2     $100
4     $50
5     $40 
Run Code Online (Sandbox Code Playgroud)

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

我需要将值输入到我正在进行的定价计算器的线性方程式中.

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

COL-A COL-B
    1     $200
    6     $100
    11     $50
    22     $40 
Run Code Online (Sandbox Code Playgroud)

如果我有9,那么我将返回611,因为9落在这两个值之间等等

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

double Min = the_lowest_value;
double Max = the_highest_value;
Run Code Online (Sandbox Code Playgroud)

我使用EF来做这个,所以它需要在LINQ中.

ken*_*n2k 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();
Run Code Online (Sandbox Code Playgroud)

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


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

对于正值:

由于default(double)0.0,该值将是确定the_lowest_value(如果指定的输入值0.5与你的第二个例子).因为the_highest_value,您可以在数据库查询之后测试它实际上是否大于或等于指定的输入值.如果不是这种情况,您将知道您指定的值大于ColA列的每个值.

  • 是的,或使用可空的结果,如:`double?the_lowest_value = ...选择(z =>(double?)z.ColA).FirstOrDefault()`.如果输入值低于DB中的最低值(最高值相同),则结果为"null". (2认同)