バインド可能な LINQ と継続的な LINQ の主な違いは何ですか?
•バインド可能な LINQ: www.codeplex.com/bindablelinq
•連続LINQ: www.codeplex.com/clinq
提供されたフィードバックに基づいて、もう 1 つのプロジェクトが追加されました。
•オブティクス: obtics.codeplex.com
バインド可能な LINQ と継続的な LINQ の主な違いは何ですか?
•バインド可能な LINQ: www.codeplex.com/bindablelinq
•連続LINQ: www.codeplex.com/clinq
提供されたフィードバックに基づいて、もう 1 つのプロジェクトが追加されました。
•オブティクス: obtics.codeplex.com
これらのパッケージの両方が解決しようとしている 2 つの問題があります: CollectionChanged イベントと動的結果セットの欠如です。1 つの追加の問題バインド可能な解決、追加の自動イベント トリガーがあります。
両方のパッケージが解決しようとしている 最初の問題は次のとおりです。
LINQ クエリによって返されるオブジェクトは、CollectionChanged イベントを提供しません。
Continuous LINQは、変更なしで、すべてのクエリに対してこれを自動的に行います。
from item in theSource select item ;
Bindable LINQは、クエリ ソース オブジェクトに .asBindable を追加すると、これを行います。
from item in theSource.AsBindable() select item ;
両方のパッケージが解決しようとしている2 番目の問題は次のとおりです。
LINQ クエリから返される結果セットは静的です。
通常、LINQ クエリを実行すると、新しいクエリを実行するまで結果セットは変更されません。これら 2 つのパッケージを使用すると、ソースが更新されるたびに結果セットが更新されます。(パフォーマンスには悪いが、リアルタイム更新には良い)
例
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 は、クエリが TextBox オブジェクト textBox1 の Text プロパティに依存していることを検出します。TextBox は WPF コントロールであるため、Bindable LINQ はコントロールの TextChanged イベントをサブスクライブすることを認識しています。
最終的な結果として、ユーザーが入力すると、クエリ内のアイテムが再評価され、変更が画面に表示されます。イベントを処理するために追加のコードは必要ありません。
別のcodeplexプロジェクトに注意を向けてもいいですか?これはObticsと呼ばれ、同じ問題を扱います(http://obtics.codeplex.com)。
これは、最初の問題と2番目の問題の両方に対処し、反応性を非常に深いレベルにします(LINQベースのレイトレーサーを使用したデモンストレーションがあります)。
EnumerableクラスのメソッドであるすべてのLINQステートメントを完全にサポートしていると主張しています。
さらに別のメカニズムを使用して、ライブクエリを作成します。
var theResultSet = ExpressionObserver.Execute(
() => from item in theSource where item.Age > 25 select item
).Cascade();
BindableLinqではLINQステートメントで「.AsBindable()」呼び出しが必要ですが、CLINQではObservableCollection<T>ではなくContinuousCollection<T>を使用する必要があることに注意してください。両方を簡単に見てから、バインド可能なLINQを使用するつもりだと思います。
それはそう; Continuous LINQ の主な問題は、汎用の IEnumerable と INotifyCollectionChanged を実装するコレクションを使用できないことです。バインド可能な LINQ は、2 つのインターフェイスを実装するカスタム コレクションを使用しても問題ありません。
IDisposable を実装しているため、バインド可能な LINQ を使用してください。したがって、クエリがいつ破棄されるかを制御できます。破棄すると、INotifyPropertyChanged へのすべてのサブスクリプションが登録解除されます。
Continuous LINQ は弱いイベントでこの問題を解決するはずですが、私がテストした限りでは機能しません。
うーん...これはバインド可能なLINQの問題のようです(2番目のアサートは失敗します):
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