Подтвердить что ты не робот

Связываемый LINQ и непрерывный LINQ

В чем основное различие между связываемым LINQ и непрерывным LINQ?

• Связываемый LINQ: www.codeplex.com/bindablelinq

• Непрерывный LINQ: www.codeplex.com/clinq

Был добавлен еще один проект на основе предоставленной обратной связи:

• Obtics: obtics.codeplex.com

4b9b3361

Ответ 1

Это две проблемы, которые пытаются решить обе эти пакеты: Отсутствие события CollectionChanged и динамических наборов результатов. Существует еще одна проблема с возможностью связывания, дополнительные автоматические триггеры событий.


Первая проблема. Оба пакета направлены на решение:

Объекты, возвращаемые запросом LINQ, не предоставляют события CollectionChanged.

Непрерывная LINQ автоматически делает это для всех запросов без изменений:

from item in theSource select item ;

Связанный LINQ делает это, когда вы добавляете .asBindable к вашему запросу. Source Object:

from item in theSource.AsBindable() select item ;

Вторая проблема. Оба пакета нацелены на решение:

Наборы результатов, возвращаемые из запроса LINQ являются статическими.

Обычно, когда вы выполняете запрос LINQ, ваш результирующий набор не изменяется до тех пор, пока вы не выполните новый запрос. С этими двумя пакетами ваш результирующий набор обновляется всякий раз, когда источник обновляется. (плохо для производительности, хорошо для обновлений в реальном времени)

Пример

var theSource = new ContinuousCollection<Customer>();
var theResultSet = from item in theSource where item.Age > 25 select item;
//theResultSet.Count would equal 0.

Поскольку вы используете Bindable или Continuous LINQ, вы можете изменить источник, а theResultSet автоматически включит новый элемент.

theSource.Add(new Customer("Bob", "Barker" , 35, Gender.Male)); //Age == 35
//theResultSet.Count would now equal 1.

Дополнительная проблема Связываемый LINQ предлагает: (Цитирование непосредственно со своей страницы)

contactsListBox.ItemsSource = from c in customers
                              where c.Name.StartsWith(textBox1.Text)
                              select c;

Связываемый LINQ будет обнаруживать, что запрос полагается на свойство Text объект TextBox, textBox1. поскольку TextBox - это элемент управления WPF, Bindable LINQ знает, подписаться на Событие TextChanged в элементе управления.

Конечным результатом является то, что пользователь типы, элементы в запросе переоценки и изменения отображаются на экран. Дополнительный код не требуется. для обработки событий.

Ответ 2

Могу ли я обратить ваше внимание на другой проект Codeplex? Он называется Obtics и занимается теми же проблемами (http://obtics.codeplex.com).

Он обращается как к первой второй, так и к дополнительной проблеме и реагирует на очень глубокий уровень (имеет демонстрацию с raytracer на основе LINQ).

Он утверждает полную поддержку всех операторов LINQ как методов класса Enumerable.

Он использует еще один механизм для создания живых запросов:

var theResultSet = ExpressionObserver.Execute(
    () => from item in theSource where item.Age > 25 select item
).Cascade();

Ответ 3

Еще одна вещь, о которой нужно помнить, хотя BindableLinq требует вызова ".AsBindable()" в заявлении LINQ, CLINQ требует, чтобы вы использовали ContinuousCollection <T> вместо ObservableCollection <T> . Посмотрев оба на короткое время, я думаю, что я собираюсь пойти с привязываемым LINQ.

Ответ 4

Действительно, основной проблемой Continuous LINQ является невозможность использования любой коллекции, которая реализует общие IEnumerable и INotifyCollectionChanged. Bindable LINQ не имеет проблем с использованием пользовательских коллекций, реализующих два интерфейса.

Ответ 5

Используйте привязываемый LINQ, поскольку он реализует IDisposable, и поэтому вы можете контролировать, когда запрос будет удален. Когда вы его разместите, все подписки на INotifyPropertyChanged будут отписаны.

Непрерывная LINQ должна решить эту проблему со слабыми событиями, но она не работает, насколько я смог проверить.

Хм... похоже, это проблема с привязываемым LINQ (второе утверждение не работает):

var _source = CreateSource_6People(); //(David, 27), (Mark, 15), (Steve, 30), (Jordan, 43), (Shiva, 30), (Erb, 43)
IBindable<int> bindable = _source.AsBindable().Sum(x => x.Age);
var agesSum = 27+15+30+43+30+43;
Assert.AreEqual(agesSum, bindable.Current); //PASSES

_source[0].Age += 1;
Assert.AreEqual(agesSum + 1, bindable.Current); //FAILS... DISAPPOINTING