2008-10-03 40 views
21

可綁定的LINQ和連續的LINQ之間的主要區別是什麼?可綁定的LINQ與連續的LINQ

•可綁定LINQ:www.codeplex.com/bindablelinq

•連續LINQ:www.codeplex.com/clinq加入

一個以上的方案基礎上提供了反饋:

• Obtics:obtics.codeplex.com

+2

不錯!我不知道這樣的事情存在。感謝您將它引入我的注意alex。 :-) – mezoid 2009-03-03 22:53:20

+0

考慮到所有這三個項目後,我決定繼續開發[我自己的解決方案](http://happynomad121.blogspot.com/2013/01/data-binding-among-complex-expressions.html),因爲它允許我寫入純LINQ到對象的查詢,無需修改,就像我以前一直所做的那樣。 – HappyNomad 2013-03-09 04:03:02

回答

25

他們是這兩個軟件包試圖解決的兩個問題:缺少一個CollectionChanged事件和動態結果集。還有一個額外的問題是可綁定解決方案,即額外的自動事件觸發器。


的第一個問題兩個軟件包旨在解決是這樣的:通過LINQ查詢返回

對象做 不能提供CollectionChanged事件。

連續LINQ自動執行此所有查詢,沒有變化:

from item in theSource select item ; 

可綁定LINQ這是否當你添加.asBindable到您的查詢源對象:

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. 

因爲你使用可綁定或連續LINQ,你可以修改theSourcetheResultSet會自動包含新項目。

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控件,因此LINQ知道訂閱控件上的 TextChanged事件。

最終結果是,作爲用戶 類型,查詢中的項目是 重新評估,並且更改顯示在 屏幕上。無需額外的代碼 來處理事件。

4

另一件事要記住,雖然BindableLinq需要在LINQ語句中的 「.AsBindable()」 的號召,CLINQ要求您使用ContinuousCollection < T>代替的ObservableCollection < T>。簡單地看了兩遍之後,我想我將會使用可綁定的LINQ。

4

確實;連續LINQ的主要問題是無法使用任何實現泛型IEnumerable和INotifyCollectionChanged的集合。可綁定的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(); 
1

使用綁定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