1

ユーザー入力に応じて動的なWHERE句を作成する必要があります。古いものを使用して、を使用ObjectContextして方法を見つけました.Where(<ESql>)

Dim qry As ObjectQuery(Of MESSGROESSE)= _objContext.MESSGROESSE
String.IsNullOrWhiteSpace(fltFormelzeichen.Text)でない場合は、
    qry = qry.Where( "it.Formelzeichen LIKE @Formelzeichen"、New ObjectParameter( "Formelzeichen"、BuildESqlWildCard(fltFormelzeichen.Text)))
終了する場合
String.IsNullOrWhiteSpace(fltBezeichnung.Text)でない場合は、
    qry = qry.Where( "it.Bezeichnung LIKE @Bezeichnung"、New ObjectParameter( "Bezeichnung"、BuildESqlWildCard(fltBezeichnung.Text)))
終了する場合

これは新しいプロジェクトであるため、通常は新しいDbContextを使用します。DbContextからObjectContextを取得する方法を知っています。

Private _objContext As ObjectContext = CType(_dbContext, IObjectContextAdapter).ObjectContext

しかし、それでは何ですか?

EDMXジェネレーターは、列名がテーブル名と同じであり、DBスキーマを制御できない場合、列名を破棄するため、オプションを使用するDbContext.Database.SqlQueryか、オプションではないようです。EDMXジェネレーターによる列名の変更を停止する方法をObjectContext.CreateQuery参照してください。

オープンソースソリューションへの依存は望んでいません。

追加した

その間、ワイルドカードが必要ないことを顧客に話したので、dbConctextでContains()を使用できます。

_dbc=新しいTPTEntities
Dim qry As DbQuery(Of MESSGROESSE)= _dbc.MESSGROESSE
qry = From e In _dbc.MESSGROESSE Take maxRows

String.IsNullOrWhiteSpace(fltFormelzeichen.Text)でない場合は、
    qry = From e In qry Where e.FORMELZEICHEN.Contains(fltFormelzeichen.Text)
終了する場合
String.IsNullOrWhiteSpace(fltBezeichnung.Text)でない場合は、
    qry = From e In qry Where e.BEZEICHNUNG.Contains(fltBezeichnung.Text)
終了する場合
String.IsNullOrWhiteSpace(fltReihenfolge.Text)でない場合は、
    qry = From e In qry Where e.REIHENFOLGE = fltReihenfolge.Text
終了する場合
qry.Load()
'TODOは_dbc.MESSGROESSE.Localであり、ここでデータを取得する正しい方法ですか?
ucoGridEditor.grd.ItemsSource = _dbc.MESSGROESSE.Local

ただし、dbContextでESql Where()を使用する方法を知りたいのですが。

4

1 に答える 1

0

DbContext は ObjectContext の上に構築されます。以下を使用して ObjectContext にドロップできます。

var objectContext = ((IObjectContextAdapter)ctx).ObjectContext;

ここで、ctx は DbContext (派生) クラスです。

ただし、esql を使用する代替手段があります。式ツリーを動的に構築できます。このスレッドEF オブジェクトのジェネリック型との比較を見てください。コードは、フィルター式を動的に作成する方法を示しています。

于 2012-10-12T16:36:38.593 に答える