Как проверить предыдущие данные в LINQ? - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть коллекция данных, которая проверяет, есть ли изменения в определенном поле, чтобы получить сумму для другого столбца.

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

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

Вы можете использовать частичный класс, а затем использовать событие OnFIELDChanging, чтобы обнаружить изменение и вызвать событие в другом месте.

Так что если в вашем файле .dbml есть таблица User, свойство которой называется скажем FirstName, то вы можете создать еще один класс, подобный этому;

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

Переданное значение является новым значением, на которое изменяется свойство.

Помогает ли это или я не в курсе ваших требований?

1 голос
/ 23 декабря 2009

Я не думаю, что LINQ сам по себе может дать вам состояние данных до того, как они были изменены. Я думаю, что вы могли бы сделать, это установить событие, когда данные собираются изменить (OnChanging) и подписаться на это событие, тогда вы отправите сумму до изменения параметра события.

Теперь, если вы хотите сделать все это в стиле LINQ, вы должны проверить Rx (Reactive) API, над которым работает MS, и все об использовании событий способом LINQ.

Если вы используете коллекцию, которая уведомляет вас об изменении в элементе ... тогда может быть передан параметр, который сообщает вам об измененных данных.

0 голосов
/ 23 декабря 2009

Если у вас есть два способа объединения данных, вы можете использовать метод 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); 
 } 
}

источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...