如何检查LINQ中的先前数据?

时间:2009-12-22 21:35:31

标签: c# .net asp.net asp.net-mvc linq

我有一组数据,用于检查特定字段是否有变化以获取另一列的总和。

Total = Details.Where(s=>s.indicator != *prior indicator before this...).Sum(s => s.amount);

3 个答案:

答案 0 :(得分:1)

我不认为LINQ本身可以在更改之前获取数据的状态。我猜您可以做的是在数据即将更改(OnChanging)时设置一个事件并订阅该事件,然后您将在事件参数更改之前发送金额。

现在,如果你想以LINQ-ish的方式完成所有这些,你应该查看MS正在使用的Rx(Reactive)API,它是关于以LINQ方式使用事件的全部内容。

如果您使用的集合通知您元素的更改,那么可能会传递一个参数来告诉您更改的数据。

答案 1 :(得分:1)

您可以使用部分类,然后使用OnFIELDChanging事件来检测更改并在其他地方调用事件。

因此,如果您的.dbml文件中有一个User表,其中有一个名为say FirstName的属性,那么您可以创建另一个这样的类;

public partial class User
{
    partial void OnFirstNameChanging(string value)
    {
    }
}

传递的值是属性更改为的新值。

这是否有帮助,或者我是否根据您的要求提供了基础?

答案 2 :(得分:0)

如果您有两个数据集合,可以使用zip方法(.Net 4.0),如此

var Total = currentData.Zip(previousData,(current,previous) => current.indicator != previous.indicator ? current.amount : 0).Sum();

如果您不使用.net 4.0,则可以使用zip的这种实现方式:

static class Enumerable 
{ 
 public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> func) 
 { 
  var ie1 = first.GetEnumerator(); 
  var ie2 = second.GetEnumerator();

  while (ie1.MoveNext() && ie2.MoveNext()) 
   yield return func(ie1.Current, ie2.Current); 
 } 
}

source