我们需要根据用户输入创建动态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))) 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
与此同时,我讨论了客户不需要通配符,因此我们可以将Contains()与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
我仍然想知道如何在dbContext上使用ESql Where()。
答案 0 :(得分:0)
DbContext构建于ObjectContext之上。您可以使用以下命令删除ObjectContext:
var objectContext = ((IObjectContextAdapter)ctx).ObjectContext;
其中ctx是您的DbContext(派生)类。
虽然有一种替代方法可以使用esql。您可以动态构建表达式树。看看这个线程EF object comparison with generic types - 代码显示了如何动态构建过滤器表达式。