我们需要根据用户输入创建动态 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.SqlQuery
orObjectContext.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()。