2

LinqtoSQLを使用してクラスにデータを入力しています。

私がやろうとしているのは、データベースにクエリを実行し、2つの整数値を返し、2つの値を互いに減算して結果を生成することですが、それを行うための賢い方法は考えられません。

この場合、私は何ができますか?

明確でない場合、、、この擬似コードの実装は、私が望む機能を明確にする必要があります。

DECLARE @currentVal INT, @previousVal INT
@currentVal = SELECT VALUE
FROM Table1
WHERE Date = CURRDATE()

@previousVal = SELECT VALUE
FROM Table1
WHERE Date = MIN(Date)

RETURN @currentVal - @previousVal

しかし、Linq to SQLでは(from o in context.Table1 where Date = currentDate select Value)、これから他の値を減算するにはどうすればよいですか?これは可能ですか?

4

4 に答える 4

2

値が実際に返されるかどうかをテストし、返される値が多すぎる場合に対処できるため、クエリの分割セットとして使用することに固執します。

var currentValResults = (from row in rows 
                         where row.Date == DateTime.Now 
                         select row.Value)
                        .ToArray();

var previousValResults = (from row in rows 
                          let minDate = rows.Min(r => r.Date)
                          where row.Date == minDate 
                          select row.Value)
                         .ToArray();

if (currentValResults.Length == 1 && previousValResults.Length == 1)
{
    var diff = currentValResults[0] - previousValResults[0];
}
else
{
    // Error condition?
}

すべてを巨大なlinqステートメントに入れると、仮定が多すぎます(または、少なくとも私の実装ではそうなります)。

于 2012-06-15T14:34:44.767 に答える
0

単純にクロスジョインしてみませんか

var query=
  from a in Table1 where a.Date == DateTime.Now
  from b in Table1 where b.Date == Table1.Min(c=>c.Date)
  select a.Amount - b.Amount;

var result=query.First();
于 2012-06-15T14:48:53.840 に答える
0

このようなものは、dbへの1回の旅行にそれを維持するために機能します(これは2つの結果のみが返されることを前提としていることに注意してください):

int[] values = (from o in context.Table1 
    where Date = currentDate || Date = context.Table1.Min(x => x.Date)
    order by Date descending
    select value).ToArray();

return values[0] - values[1];
于 2012-06-15T14:31:24.203 に答える
0
var currentVal = context.Table1.FirstOrDefault(t=>t.Date == DateTime.Now.Date);
var previousVal = context.Table1.FirstOrDefault(t=>t.Date == context.Table1.Min(d=>d.Date));

var result = currentVal - previousVal;

または

from d in context.Table1
let prevVal = context.Table1.FirstOrDefault(t=>t.Date == context.Table1.Min(d=>d.Date));
where d.Date == DateTime.Now.Date
return new { d - prevVal };
于 2012-06-15T20:19:58.643 に答える