我们需要根据用户输入创建动态 WHERE 子句。使用旧的ObjectContext我们找到了一种使用.Where(<ESql>).
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)))
万一
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
qry = qry.Where("it.Bezeichnung LIKE @Bezeichnung", New ObjectParameter("Bezeichnung", BuildESqlWildCard(fltBezeichnung.Text)))
万一
因为这是一个新项目,我们一般希望使用新的 DbContext。我知道如何从 DbContext 获取 ObjectContext:
Private _objContext As ObjectContext = CType(_dbContext, IObjectContextAdapter).ObjectContext
但是然后呢?
使用DbContext.Database.SqlQueryorObjectContext.CreateQuery似乎不是一个选项,因为 EDMX 生成器会破坏列名,如果它们与表名相同并且我们无法控制 DB 模式。请参阅如何阻止 EDMX 生成器更改列名。
我们不希望依赖开源解决方案。
添加
同时,我说服客户不再需要通配符,因此我们可以将 Contains() 与 dbConctext 一起使用:
_dbc = 新的 TPTEntities
Dim qry As DbQuery(Of MESSGROESSE) = _dbc.MESSGROESSE
qry = 从 e In _dbc.MESSGROESSE 取 maxRows
If Not String.IsNullOrWhiteSpace(fltFormelzeichen.Text) Then
qry = From e In qry Where e.FORMELZEICHEN.Contains(fltFormelzeichen.Text)
万一
If Not String.IsNullOrWhiteSpace(fltBezeichnung.Text) Then
qry = 来自 e In qry 其中 e.BEZEICHNUNG.Contains(fltBezeichnung.Text)
万一
If Not String.IsNullOrWhiteSpace(fltReihenfolge.Text) Then
qry = From e In qry 其中 e.REIHENFOLGE = fltReihenfolge.Text
万一
qry.Load()
'TODO 是 _dbc.MESSGROESSE.Local 获取数据的正确方法吗?
ucoGridEditor.grd.ItemsSource = _dbc.MESSGROESSE.Local
我仍然想知道如何在 dbContext 上使用 ESql Where()。