我們需要根據用戶輸入創建動態WHERE子句。 使用舊的ObjectContext
,我們使用.Where(<ESql>)
找到了一種方法。如何使用dbContext構建動態WHERE子句
Dim qry As ObjectQuery(Of MESSGROESSE) = _objContext.MESSGROESSE If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then qry = qry.Where("it.Formelzeichen LIKE @Formelzeichen", New ObjectParameter("Formelzeichen", BuildESqlWildCard(fltFormelzeichen.Text))) End If If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then qry = qry.Where("it.Bezeichnung LIKE @Bezeichnung", New ObjectParameter("Bezeichnung", BuildESqlWildCard(fltBezeichnung.Text))) End If
因爲這是一個新項目,我們通常會使用新的DbContext。我知道如何從DbContext獲取ObjectContext:
Private _objContext As ObjectContext = CType(_dbContext, IObjectContextAdapter).ObjectContext
但是接下來呢?
使用DbContext.Database.SqlQuery
或ObjectContext.CreateQuery
似乎不是一個選項,因爲EDMX生成器會破壞列名稱(如果它們與表名相同,並且我們無法控制數據庫模式),因此選項似乎不是選項。見How to stop the EDMX generator from changing columns names。
我們不希望依賴於開源解決方案。
ADDED
同時我跟客戶出需要通配符,所以我們可以使用包含()與dbConctext:
_dbc = New TPTEntities Dim qry As DbQuery(Of MESSGROESSE) = _dbc.MESSGROESSE qry = From e In _dbc.MESSGROESSE Take maxRows If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then qry = From e In qry Where e.FORMELZEICHEN.Contains(fltFormelzeichen.Text) End If If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then qry = From e In qry Where e.BEZEICHNUNG.Contains(fltBezeichnung.Text) End If If Not String.IsNullOrWhiteSpace(fltReihenfolge.Text) Then qry = From e In qry Where e.REIHENFOLGE = fltReihenfolge.Text End If qry.Load() 'TODO is _dbc.MESSGROESSE.Local the correct way to get at the data here? ucoGridEditor.grd.ItemsSource = _dbc.MESSGROESSE.Local
我還是想知道如何在使用ESQL其中()但是dbContext。
是的,這樣我們可以得到ObjectContext。但我不明白如何從該上下文中獲取實體:_objContext.MESSGROESSE不起作用。我錯過了什麼。 –
您需要使用ObjectSet.CreateObjectSet({「entitySetName」})函數來創建查詢http://msdn.microsoft.com/en-us/library/dd382944.aspx –
Pawel