可绑定LINQ与连续LINQ

ale*_*lex 22 bindable-linq

可绑定LINQ和连续LINQ之间的主要区别是什么?

•Bindable LINQ:www.codeplex.com/bindablelinq

•连续LINQ:www.codeplex.com/clinq

根据提供的反馈添加了另一个项目:

•Obtics:obtics.codeplex.com

Kyl*_*ser 25

这些包试图解决它们的两个问题:缺少CollectionChanged事件和动态结果集.还有一个问题是可绑定的解决方案,附加的自动事件触发器.


两个包旨在解决的第一个问题是:

LINQ查询返回的对象不提供CollectionChanged事件.

连续LINQ会自动对所有查询执行此操作,不做任何更改:

from item in theSource select item ;
Run Code Online (Sandbox Code Playgroud)

当您将.asBindable添加到查询源对象时,Bindable LINQ会执行此操作:

from item in theSource.AsBindable() select item ;
Run Code Online (Sandbox Code Playgroud)

两个包旨在解决的第二个问题是:

从LINQ查询返回的结果集是静态的.

通常,当您执行LINQ查询时,结果集将保持不变,直到您执行新查询.使用这两个包,只要更新源,就会更新结果集.(对性能不利,对实时更新有利)

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

因为你使用可绑定或连续LINQ,你可以修改theSourcetheResultSet会自动包含新项目.

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

LINQ提供的附加问题可绑定:(直接从他们自己的页面引用)

contactsListBox.ItemsSource = from c in customers
                              where c.Name.StartsWith(textBox1.Text)
                              select c;
Run Code Online (Sandbox Code Playgroud)

Bindable LINQ将检测到查询依赖于TextBox对象textBox1的Text属性.由于TextBox是WPF控件,因此Bindable LINQ知道在控件上订阅TextChanged事件.

最终结果是,当用户键入时,将重新评估查询中的项目,并在屏幕上显示更改.处理事件不需要其他代码.


vig*_*ity 5

要记住的另一件事是,尽管 BindableLinq 需要在 LINQ 语句中调用“.AsBindable()”,但 CLINQ 要求您使用 ContinuousCollection<T> 而不是 ObservableCollection<T>。在简要地查看两者之后,我想我将使用可绑定的 LINQ。


小智 5

的确; 连续 LINQ 的主要问题是无法使用任何实现通用 IEnumerable 和 INotifyCollectionChanged 的​​集合。Bindable LINQ 使用实现两个接口的自定义集合没有问题。


小智 5

我可以提请你注意另一个codeplex项目吗?它被称为Obtics并处理相同的问题(http://obtics.codeplex.com).

它解决了第一个问题和第二个问题,并将反应性提升到一个非常深的层次(使用基于LINQ的光线跟踪器进行演示).

它声称完全支持所有LINQ语句和Enumerable类的方法.

它使用另一种机制来创建实时查询:

var theResultSet = ExpressionObserver.Execute(
    () => from item in theSource where item.Age > 25 select item
).Cascade();
Run Code Online (Sandbox Code Playgroud)