2012-10-11 458 views
1

我們需要根據用戶輸入創建動態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.SqlQueryObjectContext.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。

回答

0

DbContext建立在ObjectContext之上。您可以通過使用拖放到ObjectContext中:

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

其中CTX是你的DbContext(派生)類。

雖然有一個使用esql的替代方案。您可以動態構建表達式樹。看看這個線程EF object comparison with generic types - 代碼顯示瞭如何動態地構建過濾器表達式。

+0

是的,這樣我們可以得到ObjectContext。但我不明白如何從該上下文中獲取實體:_objContext.MESSGROESSE不起作用。我錯過了什麼。 –

+0

您需要使用ObjectSet.CreateObjectSet ({「entitySetName」})函數來創建查詢http://msdn.microsoft.com/en-us/library/dd382944.aspx – Pawel