我有一组数据,用于检查特定字段是否有变化以获取另一列的总和。
Total = Details.Where(s=>s.indicator != *prior indicator before this...).Sum(s => s.amount);
答案 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);
}
}