2

我正在使用 Linq to SQL 填充一个类。

我想要做的是查询我的数据库,返回两个整数值并将这两个值相减,产生结果,但我想不出一个聪明的方法来做到这一点。

在这种情况下我能做什么?

如果不清楚,那么这个伪代码实现应该阐明我想要什么功能:

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

像这样的东西可以让它进入一次数据库之旅(请记住,这假设只会返回两个结果):

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 回答
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 回答