23

バインド可能な LINQ と継続的な LINQ の主な違いは何ですか?

•バインド可能な LINQ: www.codeplex.com/bindablelinq

•連続LINQ: www.codeplex.com/clinq

提供されたフィードバックに基づいて、もう 1 つのプロジェクトが追加されました。

•オブティクス: obtics.codeplex.com

4

6 に答える 6

26

これらのパッケージの両方が解決しようとしている 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 イベントをサブスクライブすることを認識しています。

最終的な結果として、ユーザーが入力すると、クエリ内のアイテムが再評価され、変更が画面に表示されます。イベントを処理するために追加のコードは必要ありません。

于 2008-10-06T16:05:26.427 に答える
6

別の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();
于 2009-03-03T14:26:58.167 に答える
5

BindableLinqではLINQステートメントで「.AsBindable()」呼び出しが必要ですが、CLINQではObservableCollection<T>ではなくContinuousCollection<T>を使用する必要があることに注意してください。両方を簡単に見てから、バインド可能なLINQを使用するつもりだと思います。

于 2008-12-11T19:45:26.143 に答える
5

それはそう; Continuous LINQ の主な問題は、汎用の IEnumerable と INotifyCollectionChanged を実装するコレクションを使用できないことです。バインド可能な LINQ は、2 つのインターフェイスを実装するカスタム コレクションを使用しても問題ありません。

于 2009-02-04T17:27:33.180 に答える
1

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
于 2012-08-28T15:58:21.573 に答える