Связываемый LINQ против непрерывного LINQ - PullRequest
21 голосов
/ 03 октября 2008

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

• Bindable LINQ: www.codeplex.com/bindablelinq

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

На основе предоставленного отзыва был добавлен еще один проект:

• Obtics: obtics.codeplex.com

Ответы [ 5 ]

25 голосов
/ 06 октября 2008

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


Первая проблема , которую решают оба пакета:

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

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

from item in theSource select item ;

Bindable LINQ делает это, когда вы добавляете .asBindable к вашему запросу Исходный объект:

from item in theSource.AsBindable() select item ;

Вторая проблема , которую решают оба пакета:

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

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

* Пример 1 040 *

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, вы можете изменить theSource , а theResultSet автоматически добавит новый элемент.

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

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

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

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

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

5 голосов
/ 03 марта 2009

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

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

Он заявляет о полной поддержке всех операторов LINQ методами класса Enumerable.

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

var theResultSet = ExpressionObserver.Execute(
    () => from item in theSource where item.Age > 25 select item
).Cascade();
4 голосов
/ 04 февраля 2009

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

4 голосов
/ 11 декабря 2008

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

1 голос
/ 28 августа 2012

Используйте привязываемый 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...