1

次のデータベーステーブルがあります。

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

私がしなければならないことは、値が1.5の場合、その間にある 2 つの数値を見つける必要があるため、それは12になります。

私が取り組んでいる価格計算機の線形方程式に値を入力する必要があります。

値は常に同じであるとは限らないため、次のようになることもあります。

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

9があった場合、9がこれらの 2 つの値の間にあるため、 611の両方を返します。

これを視覚化すると、それらを個別の変数に入れる必要があります。

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 が気付いたように、返されたシーケンスに少なくとも 1 つの要素が必要なため、InvalidOperationException指定された値が の値よりも小さい/大きい場合、これはクラッシュします (つまり、例外がスローされます) 。シーケンスが空の場合、デフォルト値を返すために使用できます:ColAFirst()FirstOrDefault()double

正の値の場合:

default(double)そのままで、値は0.0OKですthe_lowest_value(指定された入力値が0.52番目の例の場合)。の場合the_highest_value、DB クエリの後で、実際に指定された入力値以上かどうかをテストできます。そうでない場合は、指定した値が列のすべての値よりも大きいことがわかりColAます。

于 2012-08-09T11:23:44.323 に答える
1

これにより 1 つのクエリで解決されますが、OP は指定された値が 2 つの既存の値の間にあることを確認する必要があります。

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 に答える