私はCaliburn.Microを使用してSilverlight 5アプリケーションを開発しています(Caliburnに慣れていない人は心配しないでください、私の質問に答えるためにCaliburnのものを理解する必要はありません)、MVVMフレームワークからいくつかのデータを読み取る必要がありますSQL テーブル。私は WCF Data Service を選択しました (理由は重要ではありません)。
物事を一般的で再利用可能にするために、サービスの と を取り、データをロードするビュー モデルを作成しましDataServiceQuery<TEntity>
たURI
。このビュー モデルのビューも作成しました。データを表示するために telerik RadGridView を使用し、ビュー モデルを子ウィンドウに表示するために Caliburn IResult を使用します。アプリケーションには、ユーザーが大きなリスト (SQL テーブル) から何かを選択する必要があるフィールドを持つ多くのフォームがあるため、テーブルから何かを選択する必要があるときはいつでも、このビュー モデルとビューを使用したいと考えています。
public class SelectDBEntitiesViewModel<TEntity, TContext> : DialogScreenBase, IAmClean
where TEntity : class, new()
where TContext : DataServiceContext
{
public SelectDBEntitiesViewModel()
{
}
public void Load()
{
// load
}
public DataServiceQuery<TEntity> Query{ get; set; }
public void Filter()
{
Query = _originalQuery.AddQueryOption("$filter", "startswith(" + _filterProperty + ",'" + FilterValue + "')");
Load();
}
}
したがって、コルーチンの他のビュー モデルから、この IResult クラスを次のように作成します。
public IEnumerable<IResult> SelectInternalBeneficiary()
{
SelectDBEntitiesResult<InternalBeneficiary, QMSEntities> r = new SelectDBEntitiesResult<InternalBeneficiary, QMSEntities>(_oDataUri);
r.Query = (from ib in r.DataContext.InternalBeneficiaries where (ib.Firma == Model.GroupCompany) select ib) as DataServiceQuery<InternalBeneficiary>; r.PageSize = 2;
r.ColumnSettingsName = UserSettings.SEL_INTERNALBENEFICIARIES_GRID;
r.Header = "SELECT AN INTERNAL BENEFICIARY";
r.Subtitle = "List of all departments";
yield return r;
Model.InternalBeneficiary = r.SelectedObject.DenumireDepartament;
}
したがって、このメソッドを実行すると、子ウィンドウが開いて、ビュー モデルがデータをロードし、ビュー内のグリッドがロードされます。
今のところすべて正常に動作しますが、ビューの右上隅にテキストボックスがあり、クエリに新しい句を追加してデータをフィルタリングするために使用したいと考えています。これは一般的な内部で行う必要がありますSelectDBEntitiesViewModel
が、問題は、このビュー モデルが使用しているクエリがパラメーターとして外部から受信されることです。Filter メソッドで次のことを試しました。
Query = _originalQuery.AddQueryOption("$filter", "startswith(" + _filterProperty + ",'" + FilterValue + "')");
しかし、アプリケーションを実行すると、もちろん次のエラーが発生します。
Can't add query option '$filter' because it would conflict with the query options from the translated Linq expression.
何が起こっているかは理解しています (クエリに既に where 句があり、別のフィルターを追加することはできません) が、それを回避する方法がわかりません。
何か案は ?